[英]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.