C++中的左值与右值(二)

以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的。

1.

C++中的左值与右值(二)

  1. 怎么区分左值和右值:知乎大神@顾露的回答

  2. 我们不能直接定义一个引用的引用。但是,通过类型别名或通过模板类型参数间接定义是可以的。

引用折叠只能应用于间接创建引用的引用,如类型别名或模板参数。(C++ Primer 第609页)。

联想:可以定义指针的指针,也可以定义指针的引用。

  1. move 永远把东西变成右值,而我们可以使用forward传递那些定义为模板类型参数的右值引用的函数参数,通过其返回类型上的引用折叠,

forward可以保持给定实参的左值/右值属性。

右值引用和返回值优化经常被很多人混在一起,而且最要命的是如果开了优化的话,其实多半输出的代码是一样的。(via 知乎@vczh)

  1. 具名的右值引用是左值,不具名的右值引用是右值。(将亡值的来源)

返回不具名的右值引用主要有两种情况:

1 static_cast<T&&> (t);
2 T&&  fun
3 {
4     return t;          
5 }

正是因为返回了将亡值(不具名的右值引用),所以才可以把它们的返回值绑定到一个右值引用上。

参考:话说C++的左值、右值、将亡值

  1. T&& t (T为模板参数) 在发生自动类型推断的时候,它是未定的引用类型(universal references),如果被一个左值初始化,它就是一个左值;

如果它被一个右值初始化,它就是一个右值,它是左值还是右值取决于它的初始化。(联想到为模板元编程发明的引用折叠规则)。

需要注意的是,仅仅是当发生自动类型推导(如函数模板的类型自动推导,或auto关键字)的时候,T&&才是universal references。

没有自动类型推导的过程中,类型是确定的,是右值引用类型,只能绑定到一个右值上。

一篇我认为写的非常好的文章:从4行代码看右值引用

  1. 另外,网上介绍的一个VS的 bug 是允许函数返回局部对象的左值引用,这是不符合C++标准的。

但是可以返回右值引用和const左值引用。

  1. 字面值常量中仅有字符串字面值是左值,可以用&取地址,其他的都是右值。
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"后自动加上一个''),它不能初始化char 类型,即使是 const char *也不行。

原文链接: https://www.cnblogs.com/niuxichuan/p/5844109.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/240066

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午8:26
下一篇 2023年2月13日 下午8:26

相关推荐