Operator Priorität für "<<" und "++" in VS2008 mit Optimierung

Ich habe ein seltsames VS2008 C ++ - Problem, das so aussieht, als würde die Rangfolge der Operatoren nicht beachtet.

Meine Frage ist, was die Ausgabe davon ist:

int i = 0;  
std::cout << ((i != 0) ? "Not zero " : "zero ") << ++i << std::endl;  

Normalerweise das++ hat Vorrang vor dem<<, richtig? Oder ist das<< wird als Funktionsaufruf betrachtet, der eine höhere Priorität hat als der++? Was ist die 100% korrekte Standardantwort auf diese Frage?

Um dies zu überprüfen, habe ich ein neues leeres Projekt (VS2008-Konsolen-App) erstellt und im Hauptfenster nur diesen Code eingefügt. Hier sind die Ergebnisse:

Debug|Win32: “zero 1”  
Release|Win32: “zero 1”  
Debug|x64: “zero 1”  
Release|x64: “Not zero 1”

Übrigens liefert das folgende Beispiel genau die gleichen Ergebnisse:

i = 0;  
printf("%s %d\n", ((i != 0) ? "Not zero" : "zero"), ++i);  

Und auch das Ändern der Art der Optimierung in Release hat keine Auswirkung, aber das Deaktivieren der Optimierungsausgänge "Null 1" wie bei anderen Konfigurationen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage