何时是在C ++中调用的复制构造函数? - 功能返回

时间:2017-04-14 12:28:39

标签: c++ scope copy stack return

我正在研究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。为什么不也要求回归呢?

2 个答案:

答案 0 :(得分:2)

无法保证在C ++中调用复制构造函数。在返回的情况下,它很可能被移动取代或完全省略。

另请参阅:What are copy elision and return value optimization?

答案 1 :(得分:0)

由于您要返回局部变量,因此应用移动语义。

优化使复制,移动和返回更加精细,请参阅Tatuyuki Ishi的回答。

Here are some good examples for move semantics for return statements