【问题标题】:C++ - Return by value behaviorC++ - 按值返回行为
【发布时间】:2020-08-16 14:22:14
【问题描述】:

我正在尝试了解当函数按值返回时副本如何工作。我对以下代码感到困惑:

#include <iostream>
using namespace std;

class X {
    public:
        virtual ~X() { cout << "~X() " ; }
        X() { cout << "X() "; }
        X(X const& other) {
            cout << "X(X const&) ";
        }
};

X f(X x) {
    cout << "# ";
    return x;
}

X g(X x) {
    X y = x;
    cout << "# ";
    return y;
}

int main() {
    X a;
    cout << endl << "f: ";
    a = f(a);
    cout << endl << "g: ";
    a = g(a);
    cout << endl;       
}

输出是:

X()
f: X(X const&) # X(X const&) ~X() ~X()
g: X(X const&) X(X const&) # ~X() ~X()
~X()

这表明f 在返回之前会复制x,但g 不会。这怎么可能,x 不作为f 范围内的普通变量,因为它是它的参数之一?这种行为的一般规则是什么?

【问题讨论】:

标签: c++


【解决方案1】:

这是我认为针对g() 而不是针对f() 的优化。

非强制省略复制/移动(C++11 起)操作:

在return语句中,当操作数是具有自动存储期限的非易失性对象的名称时,不是函数参数或catch子句参数,并且是与函数返回类型相同的类类型(忽略 cv 限定)。这种复制省略的变体被称为 NRVO,“命名返回值优化”。

(摘自cppreference。粗体字是我为标记问题的重要部分而做的)

它是非强制性的,因此可能会随着编译器/优化而改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 2016-09-18
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    相关资源
    最近更新 更多