考虑以下代码:
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 有关,但我想更好地了解它在做什么。我认为没有理由必须调用复制构造函数。
这是我所期望的:
- 输入 f()
- 调用默认构造函数
- 调用移动构造函数以返回对象(可能由 RVO 优化)
- 将临时返回对象分配给引用 p
事实上,如果我将复制构造函数公开,它就会完全按照这种方式编译和工作。永远不会调用复制构造函数。x 的最终值为 0。