我不明白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
在上面的行中吗?
答案 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引用 - a
是const A*
)。
答案 2 :(得分:8)
增加的parens正在把它变成一个左值。
MSDN says
内部括号使得语句被计算为表达式而不是成员访问权。并且因为a被声明为const指针,所以类型是对const double的引用。