如何将右值引用从调用者传递给被调用者

Posted

技术标签:

【中文标题】如何将右值引用从调用者传递给被调用者【英文标题】:How to pass rvalue reference from caller to callee 【发布时间】:2019-03-03 01:09:07 【问题描述】:

假设我在下面有代码

#include <iostream>

void foo(std::string && s)  std::cout << s; 

void bar(std::string && s)  foo(s); 

int main() 

  bar("abc");

  return 0;

我收到编译错误:

错误:无法绑定‘std::string aka std::basic_string’左值 到‘std::string&& aka std::basic_string&&’ 无效 bar(std::string && s) foo(s);

【问题讨论】:

【参考方案1】:

使用来自&lt;utility&gt;std::move

#include <iostream>
#include <utility>

void foo(std::string && s)  std::cout << s; 

void bar(std::string && s)  foo(std::move(s)); 

int main() 

  bar("abc");

  return 0;

std::move 是 actually just a little bit of syntactical sugar,但它是转发右值引用的常用方式。

【讨论】:

那么为什么我需要在这里使用 std::move 呢?我得到的参数是&&,我把它给了&&。那是因为我不能将 && 分配给 && 吗?当我使用 std::move 时,实际上发生的事情不是 && 分配给 &&,而只是一个动作? 指定一个命名参数传递一个左值。对于foo(s),传递的参数是一个左值引用。左值引用不能转换为右值引用。 std::move() 基本上是将左值引用转换为右值引用的方法。

以上是关于如何将右值引用从调用者传递给被调用者的主要内容,如果未能解决你的问题,请参考以下文章

函数不将右值引用作为参数? [复制]

如何将右值引用参数传递给 C++ 中的模板 operator() 函数?

允许将右值绑定到非常量左值引用吗?

将右值引用分配给左值时发生了啥?

将右值引用绑定到(自动生成的)左值

通过 C++ 中的指针将子对象值传递给被调用者类