c++ c++11 type-inference decltype

c++ - decltype y paréntesis



auto c++ (3)

No entiendo la última línea del ejemplo en la página 148 del FCD (§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&

¿Por qué los paréntesis hacen la diferencia aquí? ¿No debería ser simplemente el double en la línea de arriba?


Justo encima de ese ejemplo, dice

  • si e es una expresión id no sin formato o un acceso de miembro de clase (5.2.5), decltype (e) es el tipo de entidad designada por e.
  • si e es un valor l, decltype (e) es T &, donde T es el tipo de e;

Creo que decltype(a->x) es un ejemplo del "acceso de miembro de clase" y decltype((a->x)) es un ejemplo de lvalue.


Los parens agregados lo están convirtiendo en un lvalue.

MSDN dice
Los paréntesis internos hacen que la declaración se evalúe como una expresión en lugar de un acceso de miembro. Y como a se declara como un puntero const, el tipo es una referencia a const double.


decltype(a->x)

Esto le proporciona el tipo de variable miembro A::x , que es double .

decltype((a->x))

Esto le da el tipo de expresión (a->x) , que es una expresión lvalue (de ahí que sea una referencia constante - a es una const A* ).