C++ 这里需要'std::move'吗?

C++ 这里需要'std::move'吗?,c++,c++11,C++,C++11,以下代码段中是否需要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)); } std::function my_std_function; void调用(std::函数和其他函数) { my_s

以下代码段中是否需要
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));
}
std::function my_std_function;
void调用(std::函数和其他函数)
{
my_std_function.swap(std::move(other_function));
}
据我所知,
call()
接受右值引用。。但是由于右值引用本身是一个左值,为了调用
swap(std::function&&)
我必须使用
std::move将其重新转换为右值引用


我的推理是否正确,或者在这种情况下可以省略
std::move
(如果可以,为什么?

std::function::swap
不通过右值引用获取其参数。这只是一个小问题。因此,
std::move
没有帮助(而且可能不应该编译,因为不允许右值引用绑定到非
const
左值引用)

其他函数
也不需要是右值引用。

签名是

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

从某种意义上说,您是对的-要再次获得右值,您需要
std::move

但是,
swap
调用不需要右值或右值引用,只需要一个普通的ol'lvalue引用

因此,您可以不使用
std::move
cast


就移动语义而言,交换操作是相当低级的。您会发现,最有用的移动最终由一系列交换实现,因此交换本身不使用移动语义是有道理的。真的,他们会怎么做?

在这种情况下,这没有什么区别,因为
std::function::swap
采用了非常量左值引用。它甚至不应该使用
std::move
进行编译

如果使用了允许右值的函数,则需要调用
std::move
,因为
other_函数
是左值,即使它的类型是右值引用。例如:

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
}
structfoo{
Foo()=默认值;

Foo(const Foo&){std::cout似乎你想在这里发出operator=而不是swap。然后,是的,使用move。@Dean这个魔法包括仅仅通过安装就可以将一台非常快的计算机变成一块热塑料吗?@Dean Er,什么?为什么它是“神奇的魔法”允许右值引用绑定到非常量左值引用?这是讽刺吗?这增加了有价值的信息,而不是仅仅提到
swap()
引用,我认为这并不是问题的关键。
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
}