C++中的左值与右值(二
来源:互联网 发布:mysql 查看梭镖 编辑:程序博客网 时间:2024/06/06 11:46
C++中的左值与右值(二)
以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的。
1.
2. 怎么区分左值和右值:知乎大神@顾露的回答。
3. 我们不能直接定义一个引用的引用。但是,通过类型别名或通过模板类型参数间接定义是可以的。
引用折叠只能应用于间接创建引用的引用,如类型别名或模板参数。(C++ Primer 第609页)。
联想:可以定义指针的指针,也可以定义指针的引用。
4. move 永远把东西变成右值,而我们可以使用forward传递那些定义为模板类型参数的右值引用的函数参数,通过其返回类型上的引用折叠,
forward可以保持给定实参的左值/右值属性。
右值引用和返回值优化经常被很多人混在一起,而且最要命的是如果开了优化的话,其实多半输出的代码是一样的。(via 知乎@vczh)
5. 具名的右值引用是左值,不具名的右值引用是右值。(将亡值的来源)
返回不具名的右值引用主要有两种情况:
1 static_cast<T&&> (t);2 T&& fun3 {4 return t; 5 }
正是因为返回了将亡值(不具名的右值引用),所以才可以把它们的返回值绑定到一个右值引用上。
参考:话说C++的左值、右值、将亡值。
6. T&& t (T为模板参数) 在发生自动类型推断的时候,它是未定的引用类型(universal references),如果被一个左值初始化,它就是一个左值;
如果它被一个右值初始化,它就是一个右值,它是左值还是右值取决于它的初始化。(联想到为模板元编程发明的引用折叠规则)。
需要注意的是,仅仅是当发生自动类型推导(如函数模板的类型自动推导,或auto关键字)的时候,T&&才是universal references。
没有自动类型推导的过程中,类型是确定的,是右值引用类型,只能绑定到一个右值上。
一篇我认为写的非常好的文章:从4行代码看右值引用。
7. 另外,网上介绍的一个VS的 bug 是允许函数返回局部对象的左值引用,这是不符合C++标准的。
但是可以返回右值引用和const左值引用。
8. 字面值常量中仅有字符串字面值是左值,可以用&取地址,其他的都是右值。
1 "abc" //左值,可以取地址2 char* ptr = "abc"; //正确的写法3 const char* ptr = "abc"; //正确的写法4 char a[] = "abc"; char* ptr = a; //正确的写法5 const char* ptr = & "abc" //错误的写法
"abc"可以直接初始化指针const char*,指针的值为字符串"abc"的首字符a的地址,但不能直接初始化char* 指针。(更正,是可以初始化char*指针的)
而&("abc")被编译器编译为const的指向数组的指针const char (*) [4](之所以是4,是因为 编译器会在"abc"后自动加上一个'\0'),它不能初始化char *类型,即使是 const char *也不行。
- C++中的左值与右值(二
- C++中的左值与右值
- c++中的左值与右值
- c++中的左值与右值
- c++中的左值与右值
- c++中的左值与右值
- c++中的左值与右值
- C++中的左值与右值
- c++中的左值与右值
- c++中的左值与右值
- c++中的左值与右值
- c++中的左值与右值
- c++中的左值与右值
- c++中的左值与右值
- c++中的左值与右值
- C 左值与右值
- 【C语言】左值与右值
- C和指针(二)指针与左值、右值详解
- html,js炫彩时钟
- 奇葩版Flappy Bird,HTML5 Flappy游戏源码下载
- 【剑指offer】无聊的1+2+...+n
- leetcode146. LRU Cache
- 为什么你的问题总是解决的一团糟?
- C++中的左值与右值(二
- AOP实现方式3——通过<aop:config>来配置(纯POJO切面)
- cocos2dx《我叫MT》源码和资源破解下载
- hibernate 连 oracle 没有主键怎么办
- jstat详解
- HTML内联元素
- Java代码Base64加密解密使用
- Django cache简单实现
- 从4行代码看右值引用