2012-10-31 11 views
11

Si consideri il seguente codice:Perché i token sono racchiusi tra parentesi e non le espressioni di valore r?

#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; 
}; 

Perché foo.bar valutare a 1?

Le parentesi in (foo.bar) non creano un'espressione senza nome (valore r) che viene quindi incrementata?

+0

No, stai confondendo questo con un altro linguaggio dove 'f (x)' e 'f ((x))' sono diversi? –

+1

@BoPersson Ma ci sono alcuni contesti in cui fa la differenza. Ad esempio 'decltype (x)' e 'decltype ((x))' possono essere diversi. – juanchopanza

+0

@juanchopanza: dannato ... è difficile! –

risposta

9

Poiché lo standard afferma esplicitamente che nel 3.4.2 para 6:

Un'espressione parentesi è un'espressione primaria il cui tipo e valore sono identici a quelli della espressione racchiusa. La presenza di parentesi su non influisce sul fatto che l'espressione sia un lvalue.

enfasi mia.

+2

Ero confuso, perché: 'struct Widget {} w;' -> 'decltype (w)' e 'decltype ((w))' non sono la stessa cosa. Vedere anche [collegamento] (https://skydrive.live.com/view.aspx?resid=F1B8FF18A2AEC5C5!1062), diapositiva 33. – Martin85

+0

@ user1787909: 'decltype' è speciale. –

1

No, le parentesi non hanno alcun significato oltre a modificare l'ordine delle operazioni.

Per creare un valore di rvalue è necessario utilizzare la funzione speciale std::move(x).

+0

questo non è giusto. potrebbero impedire che accada. –

+0

@Johannes, che cos'è Adl? –

+0

potresti voler creare una nuova domanda di StackOverflow su quello. –

Problemi correlati