C++复制省略的介绍: https://zh.wikipedia.org/wiki/%E5%A4%8D%E5%88%B6%E7%9C%81%E7%95%A5
一个有趣的例子:
class Test
{
int a_;
public:
Test(int a)
{
a_ = a;
}
Test(const Test& test) // ③
{
cout << "copy constructor" << endl;
a_ = test.a_;
}
};
int main()
{
Test test1 = Test(10); // ①
Test test2(10); // ②
}
在上述代码中,①和②的意思是不一样的。②是直接声明,①则是先初始化一个临时的对象,在将其复制给test1(这里注意一下,如果把③的const去掉,程序会报错,因为Test(10)
生成的是一个临时的对象。)
但由于copy elision特性的存在,拷贝初始化会被转换为直接初始化,即②会转换为①的形式。copy elision的特性可以在gcc中通过添加-fno-elide-constructors
关闭。上述代码是否使用copy elision会得到两个不同的结果:
引子:
https://en.wikipedia.org/wiki/Copy_elision
https://stackoverflow.com/questions/40689494/removing-the-const-in-copy-constructor
https://stackoverflow.com/questions/8124322/const-in-copy-constructor-in-c