Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ändert die Verwendung doppelter Klammern in „decltype“ den resultierenden Typ?

Warum ändert die Verwendung doppelter Klammern in „decltype“ den resultierenden Typ?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-31 11:15:29780Durchsuche

Why Does Using Double Parentheses in `decltype` Change the Resulting Type?

Typableitung mit doppelten Klammern in decltype

In C kann das Schlüsselwort decltype verwendet werden, um den Typ eines Ausdrucks zu bestimmen. Bei Verwendung mit doppelten Klammern zeigt es ein subtiles Verhalten, das zu Verwirrung führen kann.

Problem:

Bedenken Sie den folgenden Codeausschnitt:

<code class="cpp">const int&&& foo();
int i;
struct A { double x; };
const A* a = new A();
decltype(foo()) x1 = i;     // type is const int&&&
decltype(i) x2;             // type is int
decltype(a->x) x3;          // type is double
decltype((a->x)) x4 = x3;   // type is const double&</code>

Warum ändert das Hinzufügen von Klammern zu a->x in der vierten Zeile den resultierenden Typ von double zu const double&?

Antwort:

Die Erklärung liegt in die Regeln zum Ableiten von Typen mithilfe von decltype. Gemäß dem C-Sprachstandard:

  1. Wenn e ein Bezeichner ohne Klammern oder ein Klassenmitgliedszugriff ist, gibt decltype(e) den Typ der durch e benannten Entität zurück.
  2. Wenn e ist ein L-Wert, decltype(e) gibt T& zurück, wobei T der Typ von e ist.

Im gegebenen Beispiel:

  • decltype(a->x) interpretiert a->x als Klassenmitgliedszugriff, was zu einer Art Double führt.
  • decltype((a->x)) interpretiert (a->x) als L-Wert, was zu a führt Typ von const double&.

Daher ändert das Hinzufügen von Klammern zu a->x den Typabzug vom Typ des Mitglieds, auf das zugegriffen wird, zu einem Verweis auf das Mitglied selbst.

Das obige ist der detaillierte Inhalt vonWarum ändert die Verwendung doppelter Klammern in „decltype“ den resultierenden Typ?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn