Lui*_*ndo 5 c++ pointers reference decltype language-lawyer
我想知道为什么当我使用时decltype (* pointer),它将变量的类型定义为引用。例如:
int i = 42, * p = & i;
decltype (* p) c = i;
Run Code Online (Sandbox Code Playgroud)
现在c是一个参考(链接到i)。为什么它是引用而不是整数?我正在读Cpp Primer 5th。版。P. 110这样说,我不明白为什么。
与显然流行的看法相反,*p有类型int。来自[expr.unary.op]
一元*运算符执行间接操作:应用该表达式的表达式应该是指向对象类型的指针,或者是指向函数类型的指针,并且结果是指向表达式所指向的对象或函数的左值。如果表达式的类型为“指向T的指针”,则结果的类型为“ T”。
decltype(*p)产生收益的原因int&是因为decltype工作方式。来自[dcl.type.simple]
对于表达式e,由decltype(e)表示的类型定义如下:[...]
否则,如果e是未括号化的id表达式或未括号化的类成员访问,则decltype(e)是e命名的实体的类型。如果没有这样的实体,或者如果e命名了一组重载函数,则程序格式错误;
否则,如果e为x值,则decltype(e)为T &&,其中T为e的类型;否则为e。
否则,如果e为左值,则decltype(e)为T&,其中T为e的类型;否则为e。[...]
这里的id-expression表示正好由可能带有括号的名称组成的表达式。
由于*p是类型的左值表达式,int而不是未括号的id表达式或类成员访问权限,因此第三个项目符号适用,decltype(*p)为int&。
值得注意的i是一个无括号的id表达式,因此第一个项目符号适用,并且decltype(i)为int。
decltype(expr)将为您提供的类型取决于表达式的值类别。如果expr不只是一个id-expression(即直接是事物的名称),那么规则基本上是:
expr是类型的 xvalue T,decltype(expr)则将是
T&&。expr是 类型的左值T,decltype(expr)则将是T&。decltype(expr)将T。在您的情况下,*p是类型的左值int。因此decltype(*p)定义为int&。如果你想decltype给你int,你必须使表达式成为一个纯右值,例如通过应用@Cheers和hth建议的一元+运算符。- 阿尔夫在上面的评论中。但是,在实际代码中最好避免这种神秘的结构。为了可读性,最好只使用std::remove_reference_t<decltype(*p)>.
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |