2017-10-06 59 views
0
int i = 12; 

decltype(i) x4; // type is int 

decltype((i)) x5; // type is int& 

我们从C++ fundementals知道i是lvaue了。 现在decltype(i)等于表达式i的类型,其自然是int。 现在按规格/标准(i)也是一个左值和decltype((i))也应当以某种方式检查表达(i)这是左值和是相同i这也是左值的类型。但为什么标准突然需要T&类型?C++ 11:T和T&推导[行为差异,两者之间] decltype行为

这很混乱。因为如果它是decltype((i)&)那么我同意这意味着decltypeint&会更清晰准确。我在这里有点失落,为什么i(i)两者都解析为左值类型导致不同类型的TT&

+0

希望链接的重复回答你的问题。并且[这里](https://www.reddit.com/r/cpp/comments/4z8han/decltypee_decltypee/)的另一个讨论。 – songyuanyao

回答

1

参考:decltype specifier

首先,decltype实体表达不同的行为。

1)如果参数是加括号的ID-表达命名结构结合,然后decltype产生被引用类型(在结构化绑定声明的说明书中所描述的)。 (因为C++ 17)

2)如果参数是加括号的ID-表达或加括号的类的成员访问表达式,然后得到decltype由该表达式中命名的实体的类型。如果没有这样的实体,或者如果参数指定了一组重载函数,则该程序是格式不正确的。

3)如果参数是类型T的任何其他表达,和 - a)如表达式的值类是x值,然后decltype产生Ť& &; b)如果表达式的值类别是左值,则decl类型产生T &; b)如果表达式的值类别是左值,则decl类型产生T &; - c)如表达式的值类是prvalue,然后decltype产生T.

低于这个行:

注意如果一个对象的名称被加括号,则处理作为普通的左值表达,因此decltype(x)decltype((x))通常是不同的类型。

所以根据规则2,i实体,所以decltype产生的i的确切类型,这是int。根据规则3以及特别提纲(上),(i)不是实体,而是左值表达式,因此decltype产生左值参考,即int&

&(i)(i)++是有效的表达式,所以(i)是一个左)

相关问题