Я думаю, что разрешено распечатывать истину или ложь, или вообще ничего не печатать по несколько несвязанным причинам.
Истинная или ложная часть (как вы сказали) состоит в том, что уничтожение временного объекта A
не упорядочено относительно динамической инициализации b
.
Совершенно ничего не может быть связано с тем, что инициализация b
не упорядочена относительно создания / инициализации std::cout
; когда вы пытаетесь уничтожить временное, cout
, возможно, еще не был создан / инициализирован, поэтому попытка распечатать что-то может вообще не сработать. [Изменить: это характерно для C ++ 98/03 и не относится к C ++ 11.]
Изменить: вот как я, по крайней мере, вижу последовательность:
Edit2: перечитав §12.2 / 4 (еще раз), я снова изменил диаграмму. В §12.2 / 4 говорится:
Есть два контекста, в которых временные объекты уничтожаются не в конце полного выражения, а в другой точке. Первый контекст - это когда выражение появляется как инициализатор для декларатора, определяющего объект. В этом контексте временный объект, содержащий результат выражения, должен сохраняться до завершения инициализации объекта. Объект инициализируется из копии временного; во время этого копирования реализация может вызывать конструктор копирования много раз; временное уничтожается после того, как оно было скопировано, до или после завершения инициализации.
Я считаю, что это выражение является инициализатором для декларатора, определяющего объект, поэтому требуется инициализировать объект из копии значения выражения (в данном случае true
), а не непосредственно из возвращаемого значения. В случае с true
, это, вероятно, различие без разницы, но я думаю, что диаграмма технически более точна в том виде, в котором она есть сейчас.
Это также довольно ясно (я думаю), что временное удержание true
не должно быть уничтожено в конце полного выражения, поэтому я перерисовал диаграмму, чтобы это отразить.
Этот раздел отсутствует в C ++ 0x / C ++ 11, поэтому я перерисовал диаграмму (еще раз), чтобы показать разницу между ними (и насколько эта часть стала проще в C ++ 11). .
person
Jerry Coffin
schedule
22.04.2011
b
есть статическое хранилище? - person GManNickG   schedule 23.04.2011main
функцию. - person Johannes Schaub - litb   schedule 23.04.2011main
? - person Potatoswatter   schedule 23.04.2011bool b; b = A(b).yield();
будет прекрасно и напечатаетtrue
. - person Johannes Schaub - litb   schedule 23.04.2011b
будет неинициализирован при запуске деструктораA
. - person ildjarn   schedule 23.04.2011b
или нет. Ссылки просто должны быть инициализированы допустимыми объектами или функциями. Объект не нужно инициализировать. - person Johannes Schaub - litb   schedule 23.04.2011A
будет уничтожен до инициализацииb
, поэтомуstd::cout << b;
будет отправлять неинициализированный объектcout
; это не УБ? - person ildjarn   schedule 23.04.2011Johannes Schaub - litb
получает так многоUpvotes
на свои вопросы, но не так много ответов. Ха-ха .. - person Sadique   schedule 23.04.2011