c++std::move在这里不好
c++ std::move is bad here?
让我们假设我有struct Foo
和move constructor
和operator=(Foo&&)
,并将其用作数据成员:
Foo f()
{
Foo foo;
//code
return foo;
}
struct Boo {
Foo foo;
Boo() {
foo = f();//1
foo = std::move(f());//2
}
};
在(2)的情况下,我实际上不需要CCD_,但如果我在这里用它,会不会有什么不好的地方,比如阻止优化?
我读到这篇文章:为什么std::move可以防止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
在您的示例中,如果赋值运算符实现为复制和交换(operator=(Foo)
),则foo = std::move(f())
强制执行不可消除的移动,而foo = f()
可以消除从f()
的返回值到operator=
的参数的移动。
相关文章:
- Usages of std::move
- 使用std::move将std::unique_ptr作为qt信号参数传递
- 为什么 std::move 对 std::unique_lock 没有任何影响?
- 为什么我会 std::move 一个 std::shared_ptr
- 如何通过std ::承诺进入线程?由STD :: Move或STD :: Shared_ptr
- STD :: MOVE或STD ::向前转向C 中的成员变量时
- emplace(std::move(key), std::move(value)) vs emplace(std::ma
- 混合 std::move() 和 std::thread 无法编译
- std::move on std::string 是否保证 .c_str() 返回相同的结果
- Using std::move with std::shared_ptr
- std::move Vs std::forward
- 为什么 std::move 使用 std::remove_reference
- std::move 和 std::forward 有什么区别
- std::move和std::copy是否相同
- std::move 或 std::forward 参数 std::unique_ptr&<T>&
- 在移动运算符/赋值运算符中,我应该使用std::move还是std::forward
- 为什么我不需要 std::move to std::bind'ed 函数?
- 使用move()代替std::move()有什么缺陷吗?
- 带有std::move和std::make_move_iterator的C++11编译错误
- 使用 std::move 和 std::shared_ptr 有什么好处和风险(如果有的话)