В C ++ есть много вещей, где не конструируемый по умолчанию тип просто не работает. Вот очень простой пример: извлеките тип T
из istream
, используя оператор >>
без конструкции по умолчанию T
(или иным образом получая живой T
). Вы не можете, потому что сам интерфейс требует, чтобы он существовал. Интерфейс рассчитан на то, что вы всегда можете создать объект извлекаемого типа.
А если вам не дан объект для работы, это означает, что по умолчанию он создается.
Это похоже на вишневый пример, но это не так. Это частое явление, когда в общем коде вам иногда нужно просто создать T
, чтобы вы могли заполнить его позже.
Сколько бы мы ни хотели сказать, что объекты должны быть конструируемыми по умолчанию, только если для них имеет смысл находиться в таком состоянии, это просто не является практической реальностью. Иногда вам просто нужно создать объект сейчас, а потом заполнить его полезным значением.
Таким образом, библиотека Ranges v3 закрепляет это требование в базовой и часто используемой концепции SemiRegular. Эта концепция представляет некоторые из основных аспектов манипулирования объектами: я могу создать один и назначить его. Итераторы должны следовать этой концепции.
Следует также отметить, что в C ++ 20 ostream_iterator
получает конструктор по умолчанию .