decltype和括号
我不明白FCD第148页示例的最后一行(§7.6.1.2/ 4):
const int&& foo(); int i; struct A { double x; }; const A* a = new A(); decltype(foo()) x1 = i; // type is const int&& decltype(i) x2; // type is int decltype(a->x) x3; // type is double decltype((a->x)) x4 = x3; // type is const double&
为什么括号在这里有所作为? 它不应该简单地像上面那样是double
吗?
就在这个例子之上,它说
- 如果e是非隐含的idexpression式或类成员访问(5.2.5),则decltype(e)是由e命名的实体的types。
- 如果e是左值,则decltype(e)是T&,其中T是e的types;
我认为decltype(a->x)
是“类成员访问”的一个例子, decltype((a->x))
是左值的一个例子。
decltype(a->x)
这给了你成员variablesA::x
的types,它是double
。
decltype((a->x))
这给出了expression式(a->x)
,它是一个左值expression式(因此为什么它是一个const引用 – a
是一个const A*
)。
添加的parens正在把它变成一个左值。
MSDN说
内部圆括号使语句被评估为expression式而不是成员访问。 而且因为a被声明为一个const指针,所以这个types是对const double的引用。