gpt4 book ai didi

c++ - 为什么在将临时返回对象分配给引用时需要公共(public)复制构造函数?

转载 作者:搜寻专家 更新时间:2023-10-31 01:02:20 24 4
gpt4 key购买 nike

考虑以下代码:

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 开始,这种行为消失了,不再进行复制。

关于c++ - 为什么在将临时返回对象分配给引用时需要公共(public)复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27429780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com