表达式中的C++ 11类型的变量?

And*_*zos 3 c++ c++11

在C++ 11中,我对类型之间的差异感到困惑T,reference to T因为它们适用于命名变量的表达式.具体考虑:

int main()
{
    int x = 42;
    int& y = x;

    x; // (1)
    y; // (2)
}
Run Code Online (Sandbox Code Playgroud)

x上面(1)中表达式的类型是什么?难道int还是lvalue reference to int?(它的值类别显然是一个lvalue,但这与它的类型是分开的)

同样y,上面(2)中表达式的类型是什么?难道int还是lvalue reference to int

它在5.1.1.8中说:

[标识符主表达式]的类型是标识符的类型.结果是由标识符表示的实体.如果实体是函数,变量或数据成员,则结果是左值,否则为prvalue.

Jos*_*eld 10

你缺少的是这个(§5/ 5):

如果表达式最初具有"引用T" 类型(8.3.2,8.5.3),则T在进行任何进一步分析之前调整类型.

因此,尽管标识符y具有类型int&,但表达式y具有类型int.表达式永远不会有引用类型,因此两个表达式的类型都是int.

  • 正如我想的那样,"值永远不会有引用类型,只有变量可以". (4认同)
  • @KerrekSB:我认为更合理的另一种方法是引用只是原始对象的别名.创建引用后,对引用和原始对象的任何使用都是完全等效的 (2认同)