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

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; // 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


Siehe auch