Precedencia del operador para "<<" y "++" en VS2008 con optimización

Estoy atrapado con un extraño problema de C ++ VS2008, que parece que no se respeta la prioridad del operador.

Mi pregunta es cuál es el resultado de esto:

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

Normalmente el++ tiene prioridad sobre el<<, ¿derecho? O es el<< considerado como una llamada de función que le da una prioridad más alta que la++? ¿Cuál es la respuesta estándar 100% correcta a esto?

Para verificar, creé un nuevo proyecto vacío (aplicación de consola VS2008), pegué solo este código en el principal y aquí están los resultados:

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

Por cierto, el siguiente ejemplo produce exactamente los mismos resultados:

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

Y también cambiar el tipo de optimización en la versión no tiene ningún efecto, pero deshabilitar las salidas de optimización "cero 1" como otras configuraciones.

Respuestas a la pregunta(1)

Su respuesta a la pregunta