【发布时间】:2021-07-08 09:29:39
【问题描述】:
我想知道为什么下面的代码不能用 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
【问题讨论】:
-
一个问题是 MSVC 长期以来都有一个扩展,允许临时对象被非常量引用绑定。
-
可能这是因为mandatory copy elision自C++17起
-
@dewaffled 我不这么认为,因为这是 NRVO 的情况,其中复制省略不是强制性的。
-
请在问题中包含错误信息
-
@Jodocus 复制省略不仅是 return 语句中的东西,初始化对象时有关它的规则也在 c++17 中更新。这就是这里相关的部分。
标签: c++ c++17 c++14 language-lawyer copy-constructor