c++ - 为什么不能在函数之间直接传递右值引用参数?
问题描述
我的代码如下:
#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;
}
似乎str
inB::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
?
解决方案
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().m
、static_cast<A&&>(a)
和a + a
是 xvalues。表达式ar
是一个左值。