簡體   English   中英

C ++ std :: move在這里不好?

[英]c++ std::move is bad here?

假設我具有帶有move constructoroperator=(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM