通常,取消引用指针表达式会产生引用类型吗?

SLN*_*SLN 9 c++ pointers reference dereference c++11

引用指针会间接使用对象的值.但我从来没有真正理解"使用"是什么意思.我开始考虑这个问题,直到我的编译器产生以下代码的错误

int i = 0, *pi = &i;
decltype(*pi) c; // error: 'c' declared as reference but not initialized.
Run Code Online (Sandbox Code Playgroud)

我看了很长时间的错误并搜索了一些我只能给出以下论点的问题.我不知道他们是否正确.

参数1:

1)*p是一个不是变量(或非变量表达式)的表达式

2)取消引用指针表达式产生一个引用,我们实际上是使用一个引用来访问该对象的值

参数2:

仅为其decltype返回引用的解除引用表达式,它不是一般情况

请指出上述论点的任何不正确或不准确的描述.

T.C*_*.C. 13

取消引用指针会产生指向指定对象或函数的指向类型的左值表达式.它不会产生参考.* *pi是左值类型int.

decltype(此处不相关的例外)报告表达式的类型及其值类别,后者使用引用类型进行编码.由于*pi是一个左值,它编码为左值引用类型,所以decltype(*pi)int &:int对于类型,&该值类别.

表达式从不具有引用类型,因为任何引用都在"进一步分析之前"被调整掉.


*这不仅仅是技术上的区别:根据核心问题232核心问题453的方向,您可以编写有效的解除引用表达式,其中将结果绑定到引用会导致未定义的行为.


小智 5

回答您的标题问题:正如 TC 也回答的那样,不。表达式从来没有引用类型。给定 an int a; int &b = a;,表达式a和表达式b都具有 type int,并且两个表达式都是左值。

1)*p是一个不是变量的表达式(或非变量表达式)

正确的。

2)解引用指针表达式产生一个引用,我们实际上是使用一个引用来访问对象的值

取消引用一个指针会得到一个左值,它decltype会变成一个左值引用。

仅针对 decltype 返回引用的解引用表达式,这不是一般情况

我不完全确定你在这里的意思。如果您的意思是 whendecltype不产生引用,那么decltype(...) c;没有初始化程序的声明可能是有效的,那么是的,确实如此。如果您的意思是除了取消引用的指针之外,decltype永远不会产生引用类型,那么不会。例如,

int a;
decltype((a)) b; // not okay - decltype((a)) is int & because (a) is not the name of the
                 // variable, and the expression (a) is an lvalue
decltype(a) c;   // okay - decltype(a) is int because a is the name of the variable
decltype(+a) d;  // okay - decltype(+a) is int because the +a is a prvalue of type int
Run Code Online (Sandbox Code Playgroud)