C++ 11:decltype((x))和decltype((x + 1))的类型是不同的?

Hin*_*sum 1 c++ expression decltype c++11

我以为decltype((x))给出了&reference类型,但是有些实验显示了其他:

#include<stdio.h>
int main(){
    int x = 0;
    decltype((x)) r = x;
    r = 1;
    printf("%d\n",x);

    decltype((x+1)) i = x;
    i = 2;
    printf("%d\n",x);

    decltype((1)) k = x;
    k = 3;
    printf("%d\n",x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我期待(x)和(x + 1)和(1)woul都给出"int&".然而,运行结果是

1
1
1
Run Code Online (Sandbox Code Playgroud)

我期望运行结果应该是1,2,3,因为每个decltype检索引用,但似乎只有第一个工作,而两个(x + 1)和(1)只给出int,而不是'int&'.为什么,(x)和(x + 1)是不同的id-expression类型?

Ker*_* SB 6

x + 1是一个prvalue,所以它的decltype是公正的int.相比之下,x是一个id表达式,因此(x)是一个左值,它的decltype是int&.(有一个特殊规则,通过该规则,id-expression本身的decltype(例如x)是声明变量的实际类型,并且必须将表达式括起来以获取表达式的值类别.)