decltype和括号

时间:2010-06-22 23:03:49

标签: c++ c++11 type-inference 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在上面的行中吗?

3 个答案:

答案 0 :(得分:39)

就在这个例子之上,它说

  
      
  • 如果e是未加密码的id-expression或类成员访问(5.2.5),则decltype(e)是由e命名的实体的类型。
  •   
  • 如果e是左值,则decltype(e)是T&,其中T是e的类型;
  •   

我认为decltype(a->x)是“类成员访问”的示例,而decltype((a->x))是左值的示例。

答案 1 :(得分:16)

decltype(a->x)

这为您提供了成员变量A::x的类型,即double

decltype((a->x))

这为您提供了表达式(a->x)的类型,它是一个左值表达式(因此它是一个const引用 - aconst A*)。

答案 2 :(得分:8)

增加的parens正在把它变成一个左值。

MSDN says
内部括号使得语句被计算为表达式而不是成员访问权。并且因为a被声明为const指针,所以类型是对const double的引用。