我正在研究Stroustrup的原则和实践的第18章,并且我被困在与复制构造函数相关的一部分上。
我有一个复制构造函数定义为:
X(const X& x) {
out("X(X&)");
val = x.val;
}
X是一个结构。 val只是X的int值。 'out'是:
void out(const string& s) {
cerr << this << "->" << s << ": " << val << "\n";
}
我还定义了以下2个功能:
X copy(X a) {
return a;
}
和
X copy2(X a) {
X aa = a;
return aa;
}
主要是我:
X loc(4);
X loc2 = loc;
loc2 = copy(loc);
loc2 = copy2(loc);
当我只调用copy时,复制构造函数被调用两次:一次用于复制的参数范围,一次用于返回调用。这对我来说很有意义。
但是,当我调用copy2时,复制构造函数仍然只被调用两次:一次用于函数参数,一次用于'X aa = a。为什么不也要求回归呢?
答案 0 :(得分:2)
无法保证在C ++中调用复制构造函数。在返回的情况下,它很可能被移动取代或完全省略。
答案 1 :(得分:0)
由于您要返回局部变量,因此应用移动语义。
优化使复制,移动和返回更加精细,请参阅Tatuyuki Ishi的回答。
Here are some good examples for move semantics for return statements