如果返回值依赖于函数参数,是否可以对其进行优化?

问题描述 投票:0回答:1

对于以下代码,我使用 C++17:

move ctor
dtor
--------------------------------------------------------------------------------
dtor

这也是可能的输出吗?即删除移动并在调用方构造对象?

--------------------------------------------------------------------------------
dtor

这是代码:

struct Foo {
    Foo() {}
    Foo(const Foo&) { std::cout << "copy ctor" << std::endl; }
    Foo(Foo&&) { std::cout << "move ctor" << std::endl; }
    ~Foo() { std::cout << "dtor" << std::endl; }
};

Foo passit(Foo f) {
    return f;
}

int main() {
    Foo f = passit(Foo{});
    std::cout << std::string(80, '-') << std::endl;
}
c++ c++17 return-value-optimization
1个回答
0
投票

https://en.cppreference.com/w/cpp/language/copy_elision

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

此外,很难看出编译器如何在这一行决定

Foo
对象应该在
f
的地址构造,而不知道
passit()
内发生了什么,因为这实际上是需要的优化复制:

Foo f = passit(Foo{});
© www.soinside.com 2019 - 2024. All rights reserved.