Spécificateur de type decltype (C++11)
Remonter à Fonctionnalités C++11 - Index
Le standard C++11 inclut l'opérateur et le mot clé decltype, qui représentent le type d'une expression. Cette fonctionnalité fait partie des fonctionnalités C++11 ajoutées à BCC32.
Syntaxe
Voici le format de l'opérateur decltype :
decltype ( expression )
Voici les règles d'évaluation de decltype(e) :
- Si
ereprésente une expression d'identificateur ou l'accès à un membre de classe,decltype(e)est le type de l'objet désigné pare. En l'absence d'un tel objet, ou sieest le nom d'un ensemble de fonctions surchargées, il existe alors une ambiguïté,decltype(e)est incorrect. - Sinon, si
eest un appel de fonction ou invoque un opérateur surchargé,decltype(e)est le type renvoyé par la fonction. - Sinon, si
eest un lvalue,decltype(e)est une référence àT (T&)où T est le type dee. - Si aucun des autres cas s'applique,
decltype(e)est le type dee.
Exemples
Cet exemple présente quelques cas d'utilisation possible de decltype.
Voici les déclarations des structures et des fonctions nécessaires pour l'exemple, devant être situées dans le fichier d'en-tête :
const int* foo() {
return new int[0];
}
struct A {
double value;
};
class B {
int value;
public:
const A* function() {
return new A();
}
};
double GetValue(int one);
long int GetValue(double d);
template<class T>
class C {
public:
T* value;
};
Voici le code source :
double e;
const char *pch;
char ch;
A* a = new A();
B* b = new B();
C<B> *c = new C<B>();
decltype(pch) var1; // le type est const char*
decltype(ch) var2; // le type est char
decltype(a) var4; // le type est A*
decltype(a->value) var5; // le type est double
decltype((a->value)) var6 = e; // le type est const double&
decltype(foo()) var7; // f est const int*
decltype(b->function()) var8; // le type est const A*
decltype(c->value) var9; // le type est B*
decltype(GetValue(e)) var10; // bien formée, la déclaration n'est pas ambiguë
decltype(GetValue) var11; // mal formée, représente une fonction de surcharge