Когда именно инициализатор временно уничтожается?

Я построил этот эксперимент сегодня, ответив на некоторый вопрос

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

17
задан curiousguy 9 February 2019 в 23:42
поделиться