Я думаю, что разрешено распечатывать истину или ложь, или по несколько не связанным причинам, вообще ничего.
Истинная или ложная часть (как вы сказали) заключается в том, что уничтожение временного A
объекта не упорядочено в отношении динамической инициализации b
.
Возможность вообще ничего не происходит, потому что инициализация b
не упорядочена относительно создания / инициализации std::cout
; при попытке уничтожить временное cout
, возможно, еще не было создано / инициализировано, поэтому попытка распечатать что-то может вообще не сработать в этот момент. [Редактировать: это относится к C ++ 98/03 и не относится к C ++ 11.]
Редактировать: вот как я, по крайней мере, вижу последовательность:
![enter image description here](https://i.stack.imgur.com/INTq5.png)
Edit2: после перечитывания §12.2 / 4 (еще раз) я снова изменил диаграмму. §12.2 / 4 говорит:
Есть два контекста, в которых временные уничтожаются в другой точке, чем конец полного выражения. Первый контекст - это когда выражение появляется как инициализатор для декларатора, определяющего объект. В этом контексте временное хранилище, которое содержит результат выражения, должно сохраняться до завершения инициализации объекта. Объект инициализируется из копии временного; во время этого копирования реализация может вызывать конструктор копирования много раз; временный объект уничтожается после его копирования, до или после завершения инициализации.
Я полагаю, что это выражение является инициализатором для декларатора, определяющего объект, поэтому требуется инициализировать объект из копии значения выражения (в данном случае true
), а не непосредственно из возвращаемого значения. В случае true
это, вероятно, различие без разницы, но я думаю, что диаграмма технически более точна, как сейчас.
Это также довольно ясно (я думаю), что временное удержание true
не не должно быть уничтожено в конце полного выражения, поэтому я перерисовал диаграмму, чтобы отразить это тоже.
Этот раздел отсутствует в C ++ 0x / C ++ 11, поэтому я перерисовал диаграмму (еще раз), чтобы показать разницу между ними (и насколько проще этот фрагмент стал в C +) +11).