簡體   English   中英

這里是否需要`std :: move`?

[英]Is `std::move` necessary here?

以下代碼段中的std::move必要?

std::function<void(int)> my_std_function;

void call(std::function<void(int)>&& other_function)
{
  my_std_function.swap(std::move(other_function));
}

據我所知, call()接受一個右值引用..但是由於右值引用本身就是一個左值,為了調用swap(std::function<void(int)>&&)我必須將其重鑄為一個帶有std::move的右值引用

我的推理是正確的還是std::move在這種情況下可以省略(如果可以,為什么?)

std::function::swap不會通過右值引用獲取其參數。 這只是一個普通的非const左值參考 因此, std::move無用(並且可能不應該編譯,因為不允許右值引用綁定到非const左值引用)。

other_function也不需要是右值引用。

簽名是

void std::function<Sig>::swap( function& other )

因此代碼不應使用std::move編譯(msvc具有擴展名以允許此綁定:/)

當您采用r值參考時,我認為您需要的是一個簡單的賦值:

std::function<void(int)> my_std_function;

void call(std::function<void(int)>&& other_function)
{
  my_std_function = std::move(other_function); // Move here to avoid copy
}

在這種情況下,因為std::function::swap采用非常量左值引用而沒有區別。 它甚至不應該使用std::move編譯。

如果您使用的功能, 確實讓右值,那么你需要調用std::move作為other_function是一個左值,即使它的類型是右值引用。 例如:

struct Foo {
    Foo()=default;
    Foo(const Foo&) { std::cout << "copy" << std::endl; }
    Foo(Foo&&) { std::cout << "move" << std::endl; }
};

void bar (Foo&& a) {
    Foo b {a};            //copy
    Foo c {std::move(a)}; //move
}

從某種意義上來說,您是正確的-要再次獲得右值,您需要std::move

但是, swap調用不需要右值或右值引用,僅需要普通的左值引用。

因此,最好不要使用std::move cast。

就移動語義而言,交換操作是非常底層的。 您會發現,最有用的移動最終是通過一系列交換實現的,因此,交換本身不使用移動語義是有意義的。 真的,他們會怎樣?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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