2

考虑以下代码:

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。

4

1 回答 1

4

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

从 C++11 开始,这种行为消失了,不再复制。

于 2014-12-11T18:25:25.077 回答