在c++中,临时对象不能作为左值,但可以作为常量引用const &
++i = 3; // ok
i++ = 3; // error C2106: “=”: 左操作数必须为左值
1.新标准为c++带来了一个新的左值类型:带名右值引用(T&& 这是一个左值,只不过她的类型是右值引用,只能绑定右值 );带来了一个新的右值类型:无名右值引用 (std::move()来将左值转换成右值引用)。
2.左值引用(就是以前的引用)可以绑定左值,也可以绑定右值;右值引用只能绑定右值(新型右值类型(右值引用)、传统右值类型(临时对象))。
//创建两个无名引用,用来初始化两个右值引用对象
A a;
A&& b = static_cast< A&&>(a);
A&& c = std::move(a);
//b和c为带名右值引用,static_cast< A&&>(a)和std::move(a)为无名右值引用
void func (const int& i ) {
std::cout << "func(int& i) = " << i << std::endl;
}
void func ( int&& i ) {
std::cout << "func(int&& i) = " << i << std::endl;
}
void func ( std::string& s ) {
std::cout << "func(std::string& s) = " << s << std::endl;
}
void rvalue () {
std::cout << std::endl << std::endl << "-------------------------- rvalue test------------------------" << std::endl;
int i = 123;
std::string s = "hello";
func ( i ); // ok
func ( s ); // ok
// ++i = 3; // ok
// i++ = 3; // error C2106: “=”: 左操作数必须为左值
func ( 1 ); // 传过去是一个右值,根据新标准规定调用void func ( int&& i )
int&& a = std::move ( i );
func ( a ); // 左值 别忘了a是左值,类型是右值引用
func ( static_cast<int&&>( i ) ); // 右值
}
func(int& i) = 123
func(std::string& s) = hello
func(int&& i) = 1 // 右值引用绑定的优先级高于const左值引用
func(int& i) = 123
func(int&& i) = 123