2012-10-31 8 views
11

Betrachten Sie den folgenden Code ein:Warum sind Token, die in Klammern eingeschlossen sind, keine r-Wert-Ausdrücke?

#include <iostream> 

struct Foo 
{ 
    Foo() : bar(0) {} 

    int bar; 
}; 


int main() 
{ 
    Foo foo; 

    ++(foo.bar); 

    std::cout<< foo.bar << std::endl; 

    system("pause"); 
    return 0; 
}; 

Warum foo.bar-1 wertet?

Erstellen die Klammern in (foo.bar) einen unbenannten (r-Wert) Ausdruck, der dann inkrementiert wird?

+0

Nein, verwechseln Sie das mit einer anderen Sprache, in der 'f (x)' und 'f ((x))' anders sind? –

+1

@BoPersson Aber es gibt einige Kontexte, in denen es einen Unterschied macht. Zum Beispiel können 'declltype (x)' und 'declltype ((x))' anders sein. – juanchopanza

+0

@juanchopanza: Verdammt ... das ist knifflig! –

Antwort

9

Da der Standard ausdrücklich erklärt, dass in 3.4.2 para 6:

A klammerten Ausdrucks ein primärer Ausdruck, dessen Typ und Wert sind identisch mit denen des eingeschlossenen Ausdruck. Die Anwesenheit von Klammern hat keinen Einfluss darauf, ob der Ausdruck ein Lvalue ist.

Schwerpunkt meiner.

+2

Ich war verwirrt, weil: 'struct Widget {} w;' -> 'decltype (w)' und 'decltype ((w))' sind nicht das Gleiche. Siehe auch [link] (https://skydrive.live.com/view.aspx?resid=F1B8FF18A2AEC5C5!1062), Folie 33. – Martin85

+0

@ user1787909: 'declltype' ist speziell. –

1

Nein, Klammern haben keine Bedeutung außer der Reihenfolge der Operationen.

Um einen R-Wert zu erstellen, müssen Sie die Spezialfunktion std::move(x) verwenden.

+0

das ist nicht richtig. Sie können verhindern, dass adl passiert. –

+0

@Johannes, was ist Adl? –

+0

möchten Sie vielleicht eine neue Stackoverflow-Frage dazu erstellen. –