N2976 предложил добавить constexpr
к некоторым местам стандартной библиотеки. Он отмечает, что iostream
не подходит для концевых итераторов constexpr
EXCEPT. Таким образом, istream_iterator
и istreambuf_iterator
были предоставлены constexpr
конструкторы по умолчанию, и об этом. Например, вы можете увидеть в libstdС++), который constexpr
появляется только один раз во всем файле. LWG, вызвавший это изменение, был # 1129. В нем говорится:
istream_iterator
иistreambuf_iterator
должны поддерживать литерал дозорных значений. Конструктор по умолчанию часто используется для и может легко быть буквальным значением дляistreambuf_iterator
иistream_iterator
, когда значение итерации типы. [Rest omitted]
Это не имеет для меня большого смысла. Может ли кто-нибудь показать мне пример того, что они означают?
N3308 - это еще один документ, который упоминает, но не объясняет проблему:
Некоторые из конструкторов
istream_iterator<T>
должны бытьconstexpr
, еслиT
является литералом типа. Цель состоит в том, чтобы разрешить существующая технология реализации хранения типаT
inline to продолжают работать. [libstdС++ делает это,_Tp _M_value
] Однако, это фактически исключает эту технику: конструкторы по умолчанию и копии изT
не нужно отмечатьconstexpr
, а если нет, то Конструкторыistream_iterator<T>
не могли бытьconstexpr
.
Приведенный выше объясняет тривиальный конструктор копирования и деструктор, но не почему конструктор по умолчанию отмечен как constexpr.
Кроме того, тестирование на онлайн GCC 5.2.0, я скопировал реализацию libstdС++. Единственное изменение - удалить constexpr из istream_iterator()
. В обоих случаях сборки идентичны.