如何解决非常量复制构造函数可以用 C++17
我想知道为什么下面的代码不能用 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();
}
来自编译器的消息:
- A 类没有合适的拷贝构造函数
- 初始化无法从 A 转换为 A
- 由于不明确的复制构造函数或没有可用的复制构造函数,无法复制构造类 A
解决方法
fun()
是 A
类型的纯右值,所以 A a = fun();
表示 a
是函数调用的结果对象,没有中间临时对象。
此文本在 C++17 [basic.lval]/2 中:
纯右值的结果对象是初始化的对象 通过纯右值;
对于 A a = A(A(A(A(A(fun())))));
等也是一样的 - 所有纯右值都将 a
作为它们的结果对象。
return 语句的行为在 [stmt.return]/2:
return
语句初始化(显式或隐式)函数的左值结果或右值结果对象
从操作数通过复制初始化 (11.6) 调用。
结果对象可以通过从 a
(fun
的局部变量)复制初始化成功初始化,因为它是一个非常量左值,所以复制构造函数采用非常量左值引用确实绑定到它。
在 C++17 之前,fun()
的返回值是一个临时对象,然后 main 的 a
是从临时对象复制/移动构造的,省略是可选的(但有效的构造函数必须存在)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。