为什么在将临时返回对象分配给引用时需要公共拷贝构造函数?

时间:2014-12-11 18:20:56

标签: c++ constructor copy-constructor rvo

请考虑以下代码:

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()
  • 调用默认构造函数
  • 调用move构造函数返回对象(可能由RVO优化)
  • 将临时返回对象分配给引用p

事实上,如果我将复制构造函数设为public,它就会以这种方式编译和工作。永远不会调用复制构造函数。 x的最终值为0.

1 个答案:

答案 0 :(得分:4)

这与C ++ 03规则有关。在C ++ 03中,最初将一个临时值分配给引用可以复制临时值。

从C ++ 11开始,该行为已经消失,不再进行任何复制。