gpt4 book ai didi

c++ std::move 在这里不好吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:41 26 4
gpt4 key购买 nike

假设我有 struct Foo 和 move constructoroperator=(Foo&&),我将它用作数据成员:

Foo f()
{
Foo foo;
//code
return foo;
}
struct Boo {
Foo foo;
Boo() {
foo = f();//1
foo = std::move(f());//2
}
};

万一(2)我实际上不需要std::move,但是如果我在这里使用它会怎样,这会造成什么不好的情况吗?比如阻止优化?

我读到这个:Why does std::move prevent RVO?

并发现将 return foo; 更改为 return std::move(foo); 会导致禁用 RVO,但是呢(2)是否造成类似情况?如果是这样,为什么?

最佳答案

这是多余且令人困惑的。就因为我会写std::add_pointer_t<void>而不是 void* , 或 std::add_lvalue_reference_t<Foo> (或 Foo bitand )而不是 Foo& ,并不意味着我应该。

它在其他情况下也很重要:

auto&& a = f(); // OK, reference binding to a temporary extends its lifetime
auto&& b = std::move(f()); // dangling

所以,如果Foo是可以迭代的东西,

for(const auto& p : f()) {} // OK
for(const auto& p : std::move(f())) {} // UB

在您的示例中,如果赋值运算符实现为 copy-and-swap ( operator=(Foo) ),则 foo = std::move(f())强制执行不可取消的 move ,而 foo = f()可以省略 f() 的 move operator= 的参数的返回值.

关于c++ std::move 在这里不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33817899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com