首页 > 解决方案 > 为什么不能在函数之间直接传递右值引用参数?

问题描述

我的代码如下:

#include <iostream>
using namespace std;

class A{
public:
    void sendByRvalue(string&& str){
        cout << str << endl;
    }
};

class B{
private:
    A a;
    void send(string&& str){
        a.sendByRvalue(str);
    }
public:
    void run(const string& str){
        send("run " + str + "\n");
    } 
}; 

int main(void){
    string str("hello world");
    B b;
    b.run(str);
    return 0;
}

当我编译上面显示的代码时,我得到了一些编译错误: 在此处输入图像描述

似乎strinB::send函数已更改为左值。然后我改变了 的实现B::send,比如:

class B{
private:
    A a;
    void send(string&& str){
        cout << boolalpha << is_rvalue_reference<decltype(str)>::value << endl;
        a.sendByRvalue(std::move(str));
    }
public:
    void run(const string& str){
        send("run " + str + "\n");
    } 
}; 

一切都很顺利,但是这个程序的输出让我更加困惑。输出如下: 在此处输入图像描述

为什么参数 str 是一个右值引用,但我不能A::sendByRvalue直接将它传递给函数std::move

标签: c++rvalue-referencervaluelvalue-to-rvaluepass-by-rvalue-reference

解决方案


str是一个命名的右值引用,在语言中被视为左值。rvalues 只是 xvalues 或 prvalues,str两者都不是。

来自标准的注释,关于 xvalue 规则:

一般来说,这条规则的效果是命名的右值引用被视为左值,而对对象的未命名的右值引用被视为xvalue;对函数的右值引用被视为左值,无论是否命名。

struct A {
int m;
};
A&& operator+(A, A);
A&& f();

A a;
A&& ar = static_cast<A&&>(a);

表达式f()f().mstatic_­cast<A&&>(a)a + a是 xvalues。表达式ar是一个左值。


推荐阅读