在下面的代码片段中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
是否可以省略(如果可以,为什么?)
发布于 2016-01-04 23:01:09
std::function::swap
不通过右值引用获取其参数。它只是一个regular non-const
lvalue reference。所以std::move
是没有帮助的(并且可能不应该编译,因为不允许右值引用绑定到非const
左值引用)。
other_function
也不需要是一个右值引用。
发布于 2016-01-04 23:02:14
签名是
void std::function<Sig>::swap( function& other )
因此代码不应该使用std::move
编译(msvc具有允许此绑定的扩展:/)
当你使用r-value引用时,我认为一个简单的赋值就是你想要的:
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
}
发布于 2016-01-04 23:04:37
在这种情况下,这没有什么区别,因为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
}
https://stackoverflow.com/questions/34593898
复制相似问题