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
e
repré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 sie
est le nom d'un ensemble de fonctions surchargées, il existe alors une ambiguïté,decltype(e)
est incorrect. - Sinon, si
e
est un appel de fonction ou invoque un opérateur surchargé,decltype(e)
est le type renvoyé par la fonction. - Sinon, si
e
est 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