Domanda

Le garanzie operatore virgola da sinistra a destra ordine di valutazione.

[n3290: 5.18/1]: I gruppi operatore virgola da sinistra a destra

.
expression:
   assignment-expression
   expression , assignment-expression

Una coppia di espressioni separati da una virgola è valutata da sinistra a destra ; l'espressione di sinistra è un'espressione valore scartato (clausola 5). Ogni Valore calcolo e effetto collaterale associato con l'espressione sinistra viene sequenziato prima di ogni valore computazione e effetto collaterale associato con l'espressione di destra. Il tipo e il valore del risultato sono la tipo e valore dell'operando di destra; il risultato è lo stesso valore categoria come il suo operando di destra, ed è un po 'di campo se il suo operando di destra è un glvalue e un po 'di campo.

L'unica altra clausola per quanto riguarda l'operatore non fa menzione ordine di valutazione. Quindi sembrerebbe che questo è ancora il caso in cui l'operatore è stato sovraccaricato.

Ma poi, più in alto, nella tiritera generale per quanto riguarda le espressioni, ovviamente si afferma che le regole cambiano quando si esegue l'overload degli operatori:

[n3290: 5/2]: [ Nota: Gli operatori possono essere sovraccaricato, che è, dato cioè quando applicata a espressioni del tipo di classe (Clausola 9) o tipo di enumerazione (7.2). Usi di operatori di overload si trasformano in chiamate di funzione come descritto in 13.5. sovraccaricato operatori Obey le regole per la sintassi specificate nella clausola 5, ma le esigenze di tipo di operando, categoria valore, e l'ordine di valutazione sono sostituiti dai regole per chiamata di funzione. Le relazioni tra operatori, come ++a che significa a+=1, non sono garantiti per gli operatori di overload (13,5), e non sono garantiti per operandi del tipo bool. Nota -end ]

Tuttavia, questo è non-normativo del testo . C'è un normativo testo che definisce questa regola, o potrebbe un compilatore compatibile ignorarlo?

È stato utile?

Soluzione

Ho solo lo standard 03 a portata di mano, ma in essa 5/3 dice "clausola 5 definisce gli effetti degli operatori quando applicati ai tipi per i quali non sono stati sovraccaricati".

Quindi, tutto della clausola 5, compreso 5.18 / 1, si applica solo per il built-in operatori e non a qualsiasi funzione sovraccaricata.

(Un compilatore compatibile potrebbe sempre valutare gli operandi ad un sovraccarico operator ,() sinistra a destra però.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top