复制-省略
在某些情况下,在c++17中是强制的,在c++11/14中是允许的。这特别涉及到复制初始化。例如,下面的程序
#include
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都会生成上面的输出
或者
,除非显式禁用可选的构造函数省略
..。
但是c++03标准呢?是否允许省略复制构造函数
在拷贝初始化中
什么?gcc和clang with
始终禁止复制构造函数(除非指定
)。
发布于 2021-03-01 21:12:46
是的,在C++03和C++98中允许复制省略。这是C++98和C++03的段落:
复制操作的非强制省略
在下列情况下,即使复制构造函数和析构函数有明显的副作用,编译器也可以忽略类对象的复制构造。对象被直接构造到存储中,否则它们将被复制到该存储中。这是一个优化:即使当它发生时,复制构造函数没有被调用,它仍然必须存在和可访问(就像根本没有发生优化一样),否则程序是病态的:
在return语句中,当操作数是具有自动存储持续时间的非易失性对象的名称时,该对象不是函数参数或catch子句参数,并且与函数返回类型具有相同的类类型(忽略cv限定)。这种副本省略的变体被称为NRVO,即“命名返回值优化”。
在对象的初始化中,当源对象是一个无名的临时对象,并且与目标对象具有相同的类类型(忽略cv限定)时。当无名的临时值是返回语句的操作数时,这种复制省略的变体称为RVO,即“返回值优化”。
当发生复制省略时,该实现将被省略的复制操作的源和目标简单地视为引用同一对象的两种不同方式,并且该对象的销毁发生在这两个对象在没有优化的情况下将被销毁的较晚时间
cppreference首选项
我删除了从C++11开始才有效的所有内容。
C++98、C++03和C++11之间关于ellision的唯一区别是移动操作和异常处理。
https://stackoverflow.com/questions/66422584
复制相似问题