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

Why is a public copy-constructor required when assigning the temporary return object to a reference?

本文关键字:构造函数 复制 引用 分配 返回 为什么 对象      更新时间:2023-10-16

请考虑以下代码:

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。

这与

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

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