【发布时间】:2021-03-01 12:57:02
【问题描述】:
Copy-elision 在某些情况下在 c++17 中是强制性的,而在 c++11/14 中是允许的。这尤其涉及复制初始化。 比如下面这个程序
#include <iostream>
struct A
{
explicit A(int){ std::cout << "conversion" << std::endl; }
A(const A&) { std::cout << "copy constructor" << std::endl; }
};
int main()
{
A b = A(3);
}
预计在 c++17 中会产生输出
conversion
在 c++11/14 中可能会产生相同的输出。考虑到这些问题,gcc 10.1.0 和 clang 11.1.0 也会使用 -std=c++11 或 -std=c++14 生成上面的输出,除非使用 -fno-elide-constructors 显式禁用可选的构造函数省略。
但是c++03标准呢?是否允许在复制初始化中省略复制构造函数?带有-std=c++03 的 gcc 和 clang 总是禁止复制构造函数(除非指定了 -fno-elide-constructors)。
【问题讨论】:
标签: c++ language-lawyer c++03 copy-elision