对于以下代码,我使用 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;
}
https://en.cppreference.com/w/cpp/language/copy_elision
在 return 语句中,当操作数是具有自动存储期限的非易失性对象的名称时,该对象不是函数参数或 catch 子句参数,并且属于相同的类类型(忽略 cv 限定)作为函数返回类型。这种复制省略的变体称为 NRVO,“命名返回值优化”。
此外,很难看出编译器如何在这一行决定
Foo
对象应该在 f
的地址构造,而不知道 passit()
内发生了什么,因为这实际上是需要的优化复制:
Foo f = passit(Foo{});