Line Line::operator =(Line ln) {
cout << "Assignment operator\n";
Line temp;
temp.ptr = new int;
*temp.ptr = *(ln.ptr);
return temp;
}
在上面的代码中,执行以下语句时不会调用复制构造函数:
return temp;
由于返回是按值的,为什么不调用复制构造函数?
由于
答案 0 :(得分:6)
这称为 copy elision :允许不按值返回本地对象,而不是本地对象(您的temp
})直接在调用者中构造。即使拷贝构造函数有副作用,也允许这样做。
答案 1 :(得分:4)
通过上面的设置,编译器很可能省略了复制构造函数,而是直接在期望返回值的位置构造临时temp
。即使复制构造函数具有副作用,也明确允许复制省略。但是,即使复制被删除,复制或移动构造函数仍然必须是可访问的,即复制省略的可能性不会放松相应构造函数的可访问规则。
如果您觉得绝对想要调用复制构造函数,可以强制复制构造,例如,通过身份函数传递结果:
template <typename T>
T const& identity(T const& object) {
return object;
}
// ...
return identity(temp);
通常,您希望省略复制构造函数。
答案 2 :(得分:3)
我想在前面的帖子中添加注释,即使在构建目标对象时也省略了复制构造函数,它仍然必须是可访问和定义的。例如,当编译器发出错误时,你的拷贝构造函数会变为私有(除了MS VC ++至少2010年有错误:))