Spécificateur de type decltype (C++11)

De RAD Studio
Aller à : navigation, rechercher

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é par e. En l'absence d'un tel objet, ou si e 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 de e.
  • Si aucun des autres cas s'applique, decltype(e) est le type de e.

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



Voir aussi