【问题标题】:When is a copy constructor called in C++? - Function return什么时候在 C++ 中调用复制构造函数? - 函数返回
【发布时间】:2017-04-14 12:28:39
【问题描述】:

我正在阅读 Stroustrup 的《原则与实践》第 18 章,但我被困在与复制构造函数相关的一个部分。

我有一个复制构造函数定义为:

X(const X& x) {
    out("X(X&)");
    val = x.val;
}

X 是一个结构体。 val 只是 X 的一个 int 值。 “出”是:

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”。为什么不也叫return呢?

【问题讨论】:

    标签: c++ scope copy stack return


    【解决方案1】:

    不能保证在 C++ 中会调用复制构造函数。在返回的情况下,很可能会被移动替换或完全省略。

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

    【讨论】:

      【解决方案2】:

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

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

      Here are some good examples for move semantics for return statements.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-08
        • 2021-01-04
        • 2019-08-12
        • 2013-06-21
        • 1970-01-01
        • 2019-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多