首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这里有必要使用` `std::move`吗?

这里有必要使用` `std::move`吗?
EN

Stack Overflow用户
提问于 2016-01-04 22:58:02
回答 4查看 1.1K关注 0票数 13

在下面的代码片段中std::move是必需的吗?

代码语言:javascript
运行
复制
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是否可以省略(如果可以,为什么?)

EN

回答 4

Stack Overflow用户

发布于 2016-01-04 23:01:09

std::function::swap不通过右值引用获取其参数。它只是一个regular non-const lvalue reference。所以std::move是没有帮助的(并且可能不应该编译,因为不允许右值引用绑定到非const左值引用)。

other_function也不需要是一个右值引用。

票数 18
EN

Stack Overflow用户

发布于 2016-01-04 23:02:14

签名是

代码语言:javascript
运行
复制
void std::function<Sig>::swap( function& other )

因此代码不应该使用std::move编译(msvc具有允许此绑定的扩展:/)

当你使用r-value引用时,我认为一个简单的赋值就是你想要的:

代码语言:javascript
运行
复制
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
}
票数 11
EN

Stack Overflow用户

发布于 2016-01-04 23:04:37

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

如果你使用了一个允许右值的函数,那么你需要调用std::move,因为other_function是一个左值,即使它的类型是一个右值引用。例如:

代码语言:javascript
运行
复制
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
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34593898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档