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является литералом типа. Цель состоит в том, чтобы разрешить существующая технология реализации хранения типаTinline to продолжают работать. [libstdС++ делает это,_Tp _M_value] Однако, это фактически исключает эту технику: конструкторы по умолчанию и копии изTне нужно отмечатьconstexpr, а если нет, то Конструкторыistream_iterator<T>не могли бытьconstexpr.
Приведенный выше объясняет тривиальный конструктор копирования и деструктор, но не почему конструктор по умолчанию отмечен как constexpr.
Кроме того, тестирование на онлайн GCC 5.2.0, я скопировал реализацию libstdС++. Единственное изменение - удалить constexpr из istream_iterator(). В обоих случаях сборки идентичны.