53 votes

decltype et parenthèses

Je ne comprends pas la dernière ligne de l'exemple de la page 148 du 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&
 

Pourquoi les parenthèses font-elles une différence? Ne devrait-il pas simplement s'agir de double comme dans la ligne ci-dessus?

42voto

Cubbi Points 25339

Juste au-dessus de cet exemple, il est dit

  • si e est une expression id non-exprimée ou un accès membre (5.2.5), decltype (e) est le type de l'entité nommée par e.
  • si e est une valeur, decltype (e) est T & où T est le type de e;

Je pense que decltype(a->x) est un exemple d'accès "membre de classe" et decltype((a->x)) est un exemple de lvalue.

20voto

James McNellis Points 193607
 decltype(a->x)
 

Cela vous donne le type de la variable membre A::x , qui est double .

 decltype((a->x))
 

Cela vous donne le type de l'expression (a->x) , qui est une expression lvalue (d'où la raison pour laquelle il s'agit d'une référence const a est un const A* ).

11voto

Greg Domjan Points 5953

Les parens ajoutés le transforment en une lvalue.

MSDN dit
Les parenthèses internes entraînent l'évaluation de l'instruction en tant qu'expression plutôt que comme un accès membre. Et comme a est déclaré en tant que pointeur const, le type est une référence à const double.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X