gpt4 book ai didi

c++ - 非 const 复制构造函数在 C++17 下编译良好

转载 作者:行者123 更新时间:2023-12-04 03:22:15 26 4
gpt4 key购买 nike

我想知道为什么下面的代码不能用 C++14 编译,但用 C++17 编译得很好。自 C++17 以来有什么可以改变的想法吗?问题当然是关于 A 类的非常量复制构造函数。我使用的是 VS 2019。这段代码是否有效?

class A {
public:
A() { }
A(A& a) { }
};

A fun() {
A a;
return a;
}

int main()
{
A a = fun();
}

来自编译器的消息:

  1. A类没有合适的拷贝构造函数
  2. 初始化无法从 A 转换为 A
  3. 由于复制构造函数不明确或没有可用的复制构造函数,无法复制构造类 A

最佳答案

fun()A 类型的纯右值,所以 A a = fun(); 表示 a 是函数调用的结果对象,没有中间临时。

这个的文本在 C++17 [basic.lval]/2 中:

The result object of a prvalue is the object initializedby the prvalue;

A a = A(A(A(A(A(fun()))))); 等都是一样的 - 所有纯右值都有 a 作为他们的结果对象。

return语句的行为在[stmt.return]/2中:

the return statement initializes the glvalue result or prvalue result object of the (explicit or implicit) functioncall by copy-initialization (11.6) from the operand.

结果对象可以通过 a(fun 的局部变量)的复制初始化成功初始化,因为它是一个非常量左值,所以复制构造函数采用非常量左值引用确实会绑定(bind)到它。


在 C++17 之前 fun() 的返回值是一个临时对象,然后 main 的 a 是从临时对象复制/移动构造的,用省略是可选的(但有效的构造函数必须存在)。

关于c++ - 非 const 复制构造函数在 C++17 下编译良好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68298994/

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