¿Bitwise-o garantiza un pedido de evaluación?

Di que tengo este código:

unsigned int func1();
unsigned int func2();
unsigned int func3();

unsigned int x = func1() | func2() | func3();

¿C ++ garantiza que primero se llamará a func1 (), luego a func2 () y luego a func3 ()?

O se le permite al compilador llamar a las funciones en el orden que considere?

Además, ¿se le permite al compilador implementar una optimización de cortocircuito aquí si así lo desea? (por ejemplo, si func1 () devolvió ~ 0, ¿podría el compilador decidir no molestarse en llamar a func2 () o func3 (), porque sabe que sus valores de retorno no pueden afectar el valor asignado a x?)

Respuestas a la pregunta(2)

Su respuesta a la pregunta