首先,解释下什么是右值:
通常以常量的形式存在,是一个临时值,不能被程序的其它部分访问,生命周期很短。
如:
int a = 1;
int a = string("hello");
int a = numeric_linits<int>::max();
#include <iostream>
#include <typeinfo>
using namespace std;
void printValType(int &&val)
{
std::cout << "int &&" << std::endl;
}
void printValType(int& val)
{
std::cout << "int&" << std::endl;
}
int main()
{
int b = 10;
int&& a = int(1) + b;
// test.cpp:19:15: error: cannot bind ‘int’ lvalue to ‘int&&’
// int&& a = b;
// test.cpp:20:21: error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’
// int& a = int(1) + b;
cout << a << endl;;
printValType(a);
printValType((int&&)a);
}
输出:
注意看代码里注释的报错,可以看出有左值引用将报错,等号右边确实是右值。其次,将左值赋给右值类型也会报错。
// test.cpp:19:15: error: cannot bind ‘int’ lvalue to ‘int&&’ // int&& a = b; // test.cpp:20:21: error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’ // int& a = int(1) + b;
可见,右值引用的显式定义形式为:
类型 && 变量名 = 右值
其次,定义完之后,将退化为左值。