2016-07-23 21 views
4

[conv]/6 (Hervorhebung von mir ist):Was die genaue Bedeutung der Aussage ist „Der Ausdruck e wird als glvalue verwendet, wenn und nur wenn die Initialisierung es als glvalue verwendet“ in [CONV]/6

Die Auswirkung einer impliziten Konvertierung entspricht der Ausführung der entsprechenden Deklaration und Initialisierung und dann der Verwendung der temporären Variablen als Ergebnis der Konvertierung. Das Ergebnis ist Lvalue, wenn T ein Lvalue-Referenztyp oder ein Rvalue-Referenz auf Funktionstyp ([dcl.ref]) ist, ein xvalue, wenn T ein Rvalue-Referenz auf Objekttyp ist, andernfalls ein Prvalue. Der Ausdruck e wird genau dann als glvalue verwendet, wenn die Initialisierung ihn als glvalue verwendet.

Was bedeutet die hervorgehobene Aussage oben im Zusammenhang mit diesem speziellen Absatz?

+0

** Wenn und nur wenn ** ein mathematischer Begriff ist: [https://en.wikipedia.org/wiki/If_and_only_if](https://en.wikipedia.org/wiki/If_and_only_if) – Rotem

+0

a ** glvalue ** ist ein Ausdruck, dessen Auswertung die Identität eines Objekts, eines Bitfeldes oder einer Funktion bestimmt: [http://en.cppreference.com/w/cpp/language/value_category](http://de.cppreference. com/w/cpp/Sprache/Wertkategorie) – Rotem

Antwort

2

Die Absicht dieses Satzes ist zu klären, dass ein Ausdruck wie i (wobei i ist eine Variable) nicht fälschlicherweise als glvalue in Kontexten, in denen auf eine i prvalue umgewandelt wird sofort behandelt wird.

Zum Beispiel in

int main() { 
    const int j = 0; 
    constexpr int i = j; 
} 

Die zweite Definition schlecht gebildet werden würde, wenn j eine glvalue, als j is not a permitted result of a constant expression betrachtet wurde. j wird jedoch als Pr-Wert verwendet, da die Initialisierung ihn als einen Wert verwendet. Daher gilt die andere Regel im verknüpften Absatz (und die Definition ist wohlgeformt).