在“通用编程和STL (中文版)”一书中,它写道:
X x = X()将调用复制构造函数。
我觉得有点奇怪。我写了一个这样的测试程序
#include <iostream>
class Test {
public:
Test() {
std::cout << "This is ctor\n";
}
Test(const Test&) {
std::cout << "This is copy-ctor\n";
}
};
int main(int argc, char** argv)
{
Test t = Test();
return 0;
}输出是“这是ctor”。好吧,现在我糊涂了,对不对?
发布于 2011-08-25 12:08:01
当然,临时构造是默认的,然后调用复制构造函数将其复制到对象t中。
然而,在实践中,可以优化副本--尽管它有副作用(控制台输出):
[n3290: 8.5/16]:..在某些情况下,通过将中间结果直接构造到被初始化的对象中,允许实现消除这种直接初始化过程中固有的复制;参见12.2,12.8。
和(结合同一条款中的例子):
[n3290: 12.2/2]:..在使用X的复制构造函数将X(2)传递给f()之前,实现可能使用临时构造器构造X(2);或者,可以在容纳参数的空间中构造X(2)。。。
但是复制构造函数仍然必须存在,即使它可能不会被调用。
无论如何,如果在关闭优化(或者使用GCC,可能是-fno-elide-constructors)的情况下编译,您将看到:
This is ctor
This is copy-ctor发布于 2011-08-25 12:08:09
理论上,X x = X()将调用默认构造函数来创建一个临时对象,并使用复制构造函数将其复制到x中。
实际上,编译器可以直接跳过复制构造部分和默认构造x (正如David在他的注释中指出的那样,这仍然要求复制构造函数在语法上是可访问的)。至少在启用优化时,大多数编译器都会这样做。
发布于 2011-08-25 12:09:00
在这种情况下,一种形式的返回值优化(RVO) (也称为复制省略)可以在优化方面提供很大帮助。维基百科的链接对正在发生的事情有很好的解释。
https://stackoverflow.com/questions/7190026
复制相似问题