Bonjour,
J'ai regardé un peu la norme sur decltype et commencé à jouer un peu avec sur Visual Express 2010 qui supporte cette évolution.
Or en lisant la norme, il y a des choses qui m'échappent.
Pour rappel, voici ce que dit la norme (en rouge, c'est moi qui rajoute) :
Citation Envoyé par draft 3090 ¤7.1.6.2 Simple type specifiers

4 The type denoted by decltype(e) is defined as follows:
[1]— if e is an unparenthesized id-expression or a class member access (5.2.5), decltype(e) is the type of the entity named by e. If there is no such entity, or if e names a set of overloaded functions, the program is ill-formed;
[2]— otherwise, if e is a function call (5.2.2) or an invocation of an overloaded operator (parentheses arounde are ignored), decltype(e) is the return type of the statically chosen function;
[3]— otherwise, if e is an lvalue, decltype(e) is T&, where T is the type of e;
[4]— otherwise, decltype(e) is the type of e.
The operand of the decltype specifier is an unevaluated operand (Clause 5).
[ Example:
const int&& foo();
int i;
struct A { double x; };
const A* a = new A();
decltype(foo()) x1 = i; // type is const int&& [5]
decltype(i) x2; // type is int
decltype(a->x) x3; // type is double
decltype((a->x)) x4 = x3; // type is const double& [6]
—end example ]
Voilà ce que je comprend :
[1] cas où on se base sur un identifiant, çad, dans le cas courant une variable (membre ou non). Rien à dire, c'est assez compréhensible ;
[2] cas où on se base sur le retour d'une fonction (fonction, fonction membre, opérateur). Rien à dire, c'est assez compréhensible ;
[3] est-ce mon anglais qui est mauvais, une subtilité dans 'sinon, si e est une lvalue' qui m'échappe ou manque-t-il le double parenthésage qui permet d'avoir une référence : if e is an lvalue, decltype((e)) is T& ?
[4] quel cas cela concerne qui ne soit pas couvert par les précédents ? Une expression par exemple (decltype(T()+U()) ) ?
[5] Ça ne compile pas avec visual 2010. Connaissant mal les rvalue reference, je ne sais pas dire s'il s'agit d'une erreur de visual ou d'une erreur de l'exemple de la spec : cannot convert from 'int' to 'const int &&'
[6] J'ai du relire plusieurs fois le code et la norme avant de m'apercevoir que x4 est const double & car a est const. En gros, l'idée est de démontrer la différence entre l'exemple juste au dessus qui prend le type de la variable membre et celui-ci qui prend le type de l'expression. Le commentaire aurait pu être un pouillème plus clair.

Merci.