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