decltype和括号

fre*_*low 50 c++ type-inference decltype c++11

我不明白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&
Run Code Online (Sandbox Code Playgroud)

为什么括号在这里有所作为?它不应该只是double像上面那样吗?

Cub*_*bbi 40

就在这个例子之上,它说

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

我认为decltype(a->x)是"类成员访问" decltype((a->x))的一个例子,是左值的一个例子.

  • @FredOverflow:也是:`a`有类型`const A*` (7认同)

Jam*_*lis 18

decltype(a->x)
Run Code Online (Sandbox Code Playgroud)

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

decltype((a->x))
Run Code Online (Sandbox Code Playgroud)

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

  • 好的,我理解现在如何在这里应用规则,但*为什么*是这样的规则?为什么区分"a-> x"和"(a-> x)"是有意义的?这对我来说似乎很随意.为什么我会想要这种行为?有任何想法吗? (5认同)

Gre*_*jan 11

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

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