请考虑以下代码:
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有关,但我想更好地了解它正在做什么。我认为没有理由必须调用复制构造函数。
这就是我的期望:
事实上,如果我将复制构造函数设为public,它就会以这种方式编译和工作。永远不会调用复制构造函数。 x的最终值为0.
答案 0 :(得分:4)
这与C ++ 03规则有关。在C ++ 03中,最初将一个临时值分配给引用可以复制临时值。
从C ++ 11开始,该行为已经消失,不再进行任何复制。