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

时间:2018-01-22 18:58:20

标签: c++ c++11 pointers reference dereference

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

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

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

参数1:

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

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

参数2:

只有decltype返回引用的解除引用表达式,它不是一般情况

请指出上述论据的任何不正确或不准确的描述。

3 个答案:

答案 0 :(得分:13)

Dereferencing a pointer yields an lvalue expression of the pointed-to type designating the object or function pointed to.它不会产生引用。 * *piint类型的左值。

decltype(此处不相关的例外情况)报告表达式类型及其值类别the latter being encoded with reference types。由于*pi是左值,因此它被编码为左值引用类型,因此decltype(*pi)int &int为类型,&为价值类别。

表达式永远不会有引用类型,因为任何引用都会被调整掉"prior to any further analysis"

* 这不仅仅是技术上的区别:根据core issue 232core issue 453的方向,你可以写出有效的解除引用表达式它对引用的结果会导致未定义的行为。

答案 1 :(得分:4)

回答你的标题问题:作为T.C.也回答了,没有。表达式从不具有引用类型。给定int a; int &b = a;,表达式a和表达式b都具有类型int,并且两个表达式都是左值。

  

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

正确。

  

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

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

  

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

我不完全确定你的意思。如果你的意思是当decltype没有产生引用时,拥有一个没有初始化者的声明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

答案 2 :(得分:3)

事实上,标准在8.5.2.1中说:

  

一元*运算符执行间接:它所表达的表达式   应用应该是指向对象类型的指针,或指向a的指针   函数类型,结果是引用对象或的左值   表达式指向的函数。如果是表达式的类型   是“指向T的指针”,结果的类型是“T”。

所以它不是引用,但decltype()为你提供了一些实际上在C ++类型系统中有表示的东西,而引用是最接近它的东西。