2016-06-21 23 views
1

cppreference web site stellt declval mit:C++ 11 Deklination: Was ist "unbewerteter Kontext"?

Beachten Sie, dass da keine Definition für declval vorhanden ist, kann es nur

Ich überprüfte ISO C++ 11-Standard, gibt es keinen Begriff von "in unevaluierten Kontexten verwendet werden unbewerteter Kontext ". Ist das ein Konzept bei der Zusammenstellung von Prinzipien oder etwas anderem?

Danke.

+2

Suche nach „unevaluierten Operanden“ in C++ 11 –

Antwort

1

Vom Standard [§ 5, # 7]

In einigen Kontexten unevaluierten Operanden erscheinen (5.2.8, 5.3.3, 5.3.7, 7.1.6.2). Ein unevaluierter Operand wird nicht ausgewertet. [Anmerkung: In einem unausgewerteten Operanden kann ein nicht-statisches Klassenmitglied den Namen (5.1) haben und Die Benennung von Objekten oder Funktionen erfordert für sich nicht die Angabe einer Definition (3.2). - Endnote]

Die Kontexte, in denen seine verwendet werden:

  1. Typenbezeichnung [Abschnitt 5.2.8]
  2. Sizeof Operator [5.3.3]
  3. noexcept [Abschnitt 5.3. 7]
  4. Typdeklarierer Für zB decltype(declval<T>()) [Abschnitt 7.1.6.2]

Also, in Laien Begriffen (Von dem, was ich verstehe) kann es nicht als eigenständiger Ausdruck wie a + b; verwendet werden.

Wie pro Kommentar von Massa unten:

In den oben genannten Zusammenhängen ist der Ausdruck, der die unevaluierten Operand bezeichnet wird entfaltet, so dass die Art des Ergebnisses (und im Fall von sizeof, die Größe dieses Typs) kann bestimmt werden, aber die Auswertung des Ausdrucks wird nie in das endgültige Programm aufgenommen.

Beispiel: typeof(std::cout << "1\n") &x = std::cout; wird nie generiert den Code zum Drucken "1 \ n" auf die Standardausgabe.

+1

ich würde nur den letzten Satz ändern: „in diesen Zusammenhängen, der Ausdruck, der die nicht ausgewertete Operanden bezeichnet wird, so entfaltet, dass der Typ des Ergebnisses (und, im Falle von sizeof, die Größe dieses Typs) kann bestimmt werden, aber die Auswertung des Ausdrucks wird nie in das endgültige Programm aufgenommen. " ein Beispiel: 'typeof (std :: cout << "1 \ n") & x = std :: cout;' wird nie den Code generieren "1 \ n" auf die Standardausgabe zu drucken. – Massa

+0

Danke, das ist viel besser. – Arunmu