![](/img/trans.png)
[英]Why is the copy-constructor not called when returning by-value a list-initialized object?
[英]Why is a public copy-constructor required when assigning the temporary return object to a reference?
考虑以下代码:
class MyClass
{
MyClass()
{
x = 0;
}
MyClass(const MyClass&)
{
x = 1;
}
public:
int x;
MyClass(MyClass&&)
{
x = 2;
}
static const MyClass f()
{
return MyClass();
}
};
int main()
{
const MyClass& p = MyClass::f();
return 0;
}
此代码无法在VC ++ 2010上编译。
error C2248: 'MyClass::MyClass: cannot access private member declared in class 'MyClass'
我相信它与RVO有关,但我想更好地了解它的作用。 我认为没有理由必须调用复制构造函数。
这是我的期望:
实际上,如果我将复制构造函数设为公开,则它将完全按照这种方式进行编译和工作。 复制构造函数永远不会被调用。 x的最终值为0。
这与C ++ 03规则有关。 在C ++ 03中,最初将一个临时变量分配给一个引用可能会复制该临时变量。
从C ++ 11开始,该行为消失了,不再进行任何复制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.