【发布时间】:2020-09-29 16:29:52
【问题描述】:
#include <iostream>
class Test {
public:
Test(const int& i)
{
std::cout << "Direct" << std::endl;
}
Test(const Test& t)
{
std::cout << "Copy" << std::endl;
}
};
int main()
{
Test test = 1;
return 0;
}
这个程序(用C++11编译)只会输出Direct,但是Test test = 1;意味着隐式转换1到测试然后将结果复制到test,我希望它同时输出@987654327 @和Copy,谁能解释一下?
【问题讨论】:
-
您要查找的搜索词是“复制省略”。复制构造函数(和相应的析构函数)在看起来应该调用时不被调用是合法的,并且在某些情况下是必需的。例如,请参阅 cppreference.com 上的 copy elision
-
那么这种行为的目的仅仅是为了性能?我必须在任何构造函数中做同样的事情?
-
“仅用于性能” - 我的意思是,是吗?!这是 C++,我们力求获得最佳性能。甚至在概念上,创建一个临时对象有什么用处,它只是为了初始化 另一个 对象,然后立即被销毁?!还不如将整个初始化折叠为单个 c'tor 调用。
-
是的,复制省略是一种性能优化。我不明白你的问题“我必须做同样的事情......?” - 你不需要做任何事情,编译器会做优化。
标签: c++