C++——右值引用

在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值