Я построил этот эксперимент сегодня, после ответа на какой-то вопрос
struct A {
bool &b;
A(bool &b):b(b) { }
~A() { std::cout << b; }
bool yield() { return true; }
};
bool b = A(b).yield();
int main() { }
b
имеет значение false
(в результате инициализации нуля) перед установкой его в true
с помощью динамической инициализации. Если временная информация будет уничтожена до завершения инициализации b
, мы напечатаем false
, иначе true
.
Спектр говорит, что временное уничтожается в конце полного выражения. Это не похоже на упорядочение с инициализацией b
. Поэтому мне интересно
- Позволяет ли спецификация разрешить реализации печатать как
false
, так иtrue
в разных прогонах?
Clang печатает false
для вышеуказанного, а GCC печатает true
. Это меня смущает. Пропустил ли я некоторый текст спецификации, определяющий порядок?