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的引用。