[英]Returning move-only type compiles even though copy-constructor is unavailable
以下编译没有错误:
#include <memory>
std::unique_ptr<int> f() {
std::unique_ptr<int> x(new int(42));
return x;
}
int main() {
std::unique_ptr<int> y = f();
}
我认为f()
的返回值是由x
复制初始化的,但std::unique_ptr
是仅移动类型。 为什么这不是格式错误的,因为复制构造函数不可用? 标准中的相关条款是什么? 有没有地方说如果f()
是仅移动类型而不是 return 语句变成移动构造而不是复制构造?
我认为
f()
的返回值是由x
复制初始化的,但std::unique_ptr
是仅移动类型
f()
的返回值确实是从表达式x
复制初始化的,但复制初始化并不总是意味着复制构造。 如果表达式是一个右值,那么移动构造函数将被重载决议选取(假设存在移动构造函数)。
现在虽然表达式x
中的return x;
是正确的return x;
语句是左值(这可能会让你认为我刚刚写的不适用),在返回具有自动存储期的命名对象的情况下,编译器首先会尝试将id表达式视为右值进行重载解析度。
标准中的相关条款是什么? 有没有地方说如果
f()
是仅移动类型而不是return
语句变成移动构造而不是复制构造?
根据 C++ 标准([class.copy]/32,草案 N4296)的第 12.8/32 段:
当满足复制/移动操作的省略条件,但不满足异常声明,并且要复制的对象由左值指定时,或者当
return
语句中的表达式是(可能带括号的) id-表达名称带有自动存储持续时间的对象在身体或最里面的封闭功能或λ-表达,过载分辨率选择首先执行用于复制的构造的参数声明子句声明为如果对象是由一个rvalue指定. [...]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.