繁体   English   中英

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

[英]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有关,但我想更好地了解它的作用。 我认为没有理由必须调用复制构造函数。

这是我的期望:

  • 输入f()
  • 调用默认构造函数
  • 调用move构造函数以返回对象(可能已通过RVO优化)
  • 将临时返回对象分配给参考p

实际上,如果我将复制构造函数设为公开,则它将完全按照这种方式进行编译和工作。 复制构造函数永远不会被调用。 x的最终值为0。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM