Bitwise ou garante uma ordem de avaliação?

Dizem que tenho este código:

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

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

C ++ garante que func1 () seja chamado primeiro, depois func2 () e depois func3 ()?

O compilador pode chamar as funções em qualquer ordem que parece

Além disso, o compilador tem permissão para implementar aqui uma otimização de curto-circuito, se quiser? (por exemplo, se func1 () retornou ~ 0, o compilador pode decidir não se incomodar em chamar func2 () ou func3 (), porque sabe que seus valores de retorno não podem afetar o valor atribuído a x?)

questionAnswers(2)

yourAnswerToTheQuestion