[英]c++ std::move is bad here?
假設我具有帶有move constructor
和operator=(Foo&&)
struct Foo
,並將其用作數據成員:
Foo f()
{
Foo foo;
//code
return foo;
}
struct Boo {
Foo foo;
Boo() {
foo = f();//1
foo = std::move(f());//2
}
};
在情況(2)中,我實際上不需要std::move
,但是如果我在這里使用它,會帶來不好的事情,例如阻止優化嗎?
我讀到這: 為什么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&
, Foo bitand
並不意味着我應該這樣做。
在其他情況下也很重要:
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=
參數的移動。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.