我正在创建一个链接类型的类,例如下面的小示例。似乎在链接成员函数时,将调用复制构造函数。有没有办法摆脱复制构造函数调用?在下面的玩具示例中,很明显,我只在处理临时工,因此“应该”(也许不是按标准,而是从逻辑上)是一种省略。复制省略的第二个最佳选择是调用move构造函数,但事实并非如此。
class test_class {
private:
int i = 5;
public:
test_class(int i) : i(i) {}
test_class(const test_class& t) {
i = t.i;
std::cout << "Copy constructor"<< std::endl;
}
test_class(test_class&& t) {
i = t.i;
std::cout << "Move constructor"<< std::endl;
}
auto& increment(){
i++;
return *this;
}
};
int main()
{
//test_class a{7};
//does not call copy constructor
auto b = test_class{7};
//calls copy constructor
auto b2 = test_class{7}.increment();
return 0;
}
编辑:一些澄清。1.这不取决于优化级别。2.在我的实际代码中,我有比ints更复杂(例如,分配堆)的对象
auto b = test_class{7};
不会调用拷贝构造函数,因为它实际上等同于拷贝构造函数,test_class b{7};
并且编译器足够聪明,可以识别这种情况,因此可以轻松消除任何拷贝。不能做同样的事情b2
。
std::cout
复印控制器中是否确实有I / O()?没有它,副本应该被优化掉。