Typ-Bezeichner decltype (C++11)
Nach oben zu C++11-Features - Index
Der C++11-Standard enthält das Schlüsselwort und den Operator decltype, der den Typ eines Ausdrucks repräsentiert. Dieses C++11-Feature wurde zu BCC32 hinzugefügt.
Syntax
Das Format des decltype-Operators lautet:
decltype ( expression )
Regeln für die Auswertung von decltype(e)
:
- Wenn
e
ein Bezeichnerausdruck für den Zugriff auf einen Klassen-Member ist, dann istdecltype(e)
der Typ des vone
bezeichneten Elements. Wenn ein solches Element nicht vorhanden odere
der Name einer überladenen Funktionsmenge ist, so besteht eine Mehrdeutigkeit unddecltype(e)
ist ungültig. - Wenn
e
ein Funktionsaufruf ist oder einen überladenen Operator aufruft, so istdecltype(e)
der von der Funktion zurückgegebene Typ. - Wenn
e
ein L-Wert ist, so istdecltype(e)
eine Referenz aufT (T&)
, wobei T der Typ vone
ist. - Wenn keiner dieser Fälle zutrifft, ist
decltype(e)
der Typ vone
.
Beispiele
Dieses Beispiel stellt einige Anwendungsmöglichkeiten für decltype
bereit.
Die folgenden Deklarationen der Strukturen und Funktionen sind für das Beispiel erforderlich und müssen in der Header-Datei gesetzt werden:
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;
};
Der Quelltext lautet:
double e;
const char *pch;
char ch;
A* a = new A();
B* b = new B();
C<B> *c = new C<B>();
decltype(pch) var1; // type is const char*
decltype(ch) var2; // type is char
decltype(a) var4; // type is A*
decltype(a->value) var5; // type is double
decltype((a->value)) var6 = e; // type is const double&
decltype(foo()) var7; // f is const int*
decltype(b->function()) var8; // type is const A*
decltype(c->value) var9; // type is B*
decltype(GetValue(e)) var10; // well-formed, the declaration is not ambiguous
decltype(GetValue) var11; // ill-formed, represents an overload function