2017-02-22 88 views
0

我在想,decltype((X))给予&引用类型,但一些实验表明某事别人:C++ 11:decltype((x))和decltype((x + 1))的类型是不同的?

#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; 
} 

我期待的是(X)和(x + 1)和(1)竟被全部给出“int &”。但是运行结果是

1 
1 
1 

我预计随着各decltype检索参考,但似乎只是一号工程运行结果应该1,2,3,同时兼具(X + 1)(1)给出只有int,而不是'int &'。 为什么,(x)和(x + 1)是不同的id表达式类型?

+0

如果我正确理解标准,'x'是一个* id-表达式*,但'(x)'不是。 –

+0

[\ [expr.prim.lambda \]](http://eel.is/c++draft/expr.prim.lambda#20)每个出现的'decltype((x))'其中'x'是一个可能用括号表示的名称为自动存储持续时间的实体 的id表达式被视为“x”被转换​​为对相应数据的访问 如果'x'是odr-使用表示的实体。 – 0x499602D2

+0

@ 0x499602D2这段代码中的闭包类型在哪里? –

回答

5

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