Typ-Bezeichner decltype (C++11)

Aus RAD Studio
Wechseln zu: Navigation, Suche

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 ( Ausdruck )

Regeln für die Auswertung von decltype(e):

  • Wenn e ein Bezeichnerausdruck für den Zugriff auf einen Klassen-Member ist, dann ist decltype(e) der Typ des von e bezeichneten Elements. Wenn ein solches Element nicht vorhanden oder e der Name einer überladenen Funktionsmenge ist, so besteht eine Mehrdeutigkeit und decltype(e) ist ungültig.
  • Wenn e ein Funktionsaufruf ist oder einen überladenen Operator aufruft, so ist decltype(e) der von der Funktion zurückgegebene Typ.
  • Wenn e ein L-Wert ist, so ist decltype(e) eine Referenz auf T (T&), wobei T der Typ von e ist.
  • Wenn keiner dieser Fälle zutrifft, ist decltype(e) der Typ von e.

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; // Typ ist const char*
	decltype(ch) var2; // Typ ist char
	decltype(a) var4; // Typ ist A*
	decltype(a->value) var5; // Typ ist double
	decltype((a->value)) var6 = e; // Typ ist const double&
	decltype(foo()) var7; // f ist const int*
	decltype(b->function()) var8; // Typ ist const A*
	decltype(c->value) var9; // Typ ist B*
	decltype(GetValue(e)) var10; // wohlgeformt, die Deklaration ist nicht mehrdeutig
	decltype(GetValue) var11; // nicht wohlgeformt, repräsentiert eine überladene Funktion


Siehe auch