c++11右值引用的绑定规则
来源:互联网 发布:社交网络电影观后感 编辑:程序博客网 时间:2024/04/29 04:47
右值引用的绑定规则
右值引用(rvalue reference,&&)跟传统意义上的引用(reference,&)很相似,为了更好地区分它们俩,传统意义上的引用又被称为左值引用(lvalue reference)。下面简单地总结了左值引用和右值引用的绑定规则(函数类型对象会有所例外):
(1)非const左值引用只能绑定到非const左值;
(2)const左值引用可绑定到const左值、非const左值、const右值、非const右值;
(3)非const右值引用只能绑定到非const右值;
(4)const右值引用可绑定到const右值和非const右值。
测试例子如下:
struct A { A(){} };A lvalue; // 非const左值对象const A const_lvalue; // const左值对象A rvalue() {return A();} // 返回一个非const右值对象const A const_rvalue() {return A();} // 返回一个const右值对象// 规则一:非const左值引用只能绑定到非const左值A &lvalue_reference1 = lvalue; // okA &lvalue_reference2 = const_lvalue; // errorA &lvalue_reference3 = rvalue(); // errorA &lvalue_reference4 = const_rvalue(); // error// 规则二:const左值引用可绑定到const左值、非const左值、const右值、非const右值const A &const_lvalue_reference1 = lvalue; // okconst A &const_lvalue_reference2 = const_lvalue; // okconst A &const_lvalue_reference3 = rvalue(); // okconst A &const_lvalue_reference4 = const_rvalue(); // ok// 规则三:非const右值引用只能绑定到非const右值A &&rvalue_reference1 = lvalue; // errorA &&rvalue_reference2 = const_lvalue; // errorA &&rvalue_reference3 = rvalue(); // okA &&rvalue_reference4 = const_rvalue(); // error// 规则四:const右值引用可绑定到const右值和非const右值,不能绑定到左值const A &&const_rvalue_reference1 = lvalue; // errorconst A &&const_rvalue_reference2 = const_lvalue; // errorconst A &&const_rvalue_reference3 = rvalue(); // okconst A &&const_rvalue_reference4 = const_rvalue(); // ok// 规则五:函数类型例外void fun() {}typedef decltype(fun) FUN; // typedef void FUN();FUN & lvalue_reference_to_fun = fun; // okconst FUN & const_lvalue_reference_to_fun = fun; // okFUN && rvalue_reference_to_fun = fun; // okconst FUN && const_rvalue_reference_to_fun = fun; // ok
【说明】:(1) 一些支持右值引用但版本较低的编译器可能会允许右值引用绑定到左值,例如g++4.4.4就允许,但g++4.6.3就不允许了,clang++3.2也不允许,据说VS2010 beta版允许,正式版就不允许了,本人无VS2010环境,没测试过。
(2)右值引用绑定到字面值常量同样符合上述规则,例如:int &&rr = 123;,这里的字面值123虽然被称为常量,可它的类型为int,而不是const int。对此C++03标准文档4.4.1节及其脚注中有如下说明:
If T is a non-class type, the type of the rvalue is the cv-unqualified version of T.
In C++ class rvalues can have cv-qualified types (because they are objects). This differs from ISO C, in which non-lvalues never have cv-qualified types.
因此123是非const右值,int &&rr = 123;语句符合上述规则三。
- c++11右值引用的绑定规则
- C++/C++11中左值、左值引用、右值、右值引用的使用
- [C++]C++11右值引用
- C++ 11 右值引用的理解
- C++ 11右值引用的理解
- C++ 11的右值引用
- C++11的右值引用
- c++11的右值引用&&
- C++11的右值引用
- 【C++】C++11特性:右值引用与转发
- C++的右值引用
- c++的右值引用
- 图说函数模板右值引用参数(T&&)类型推导规则(C++11)
- c++move语义与右值引用
- C++:右值引用与移动构造
- [C++]右值引用和转移语义
- C++primer学习笔记--右值引用
- 【C++】右值引用与模板
- Java Cookie详解
- 通过反射,获取多路委托的全部返回结果
- qt-使用vs2012调试qt程序
- 日期的星期操作
- java的11个特性
- c++11右值引用的绑定规则
- [SELinux Policy]如何设置SELinux策略规则?
- 理解P值
- 常用R包内容梳理
- springMVC之上传文件
- Android内存泄漏的各种原因详解
- java读写HDFS简单demo
- 机器学习笔记(十)——Logistic Function AND Softmax Function
- Android-TV-Frame v1.4.0 发布,Android TV 开发框架