Я построил этот эксперимент сегодня, после ответа на какой-то вопрос
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. Это меня смущает. Пропустил ли я некоторый текст спецификации, определяющий порядок?
