N2976 предложил добавить constexpr
в некоторые места в стандартной библиотеке. Он отмечает, что iostream
s не подходят для constexpr
ЗА ИСКЛЮЧЕНИЕМ конечных итераторов. Таким образом, istream_iterator
и istreambuf_iterator
получили constexpr
конструкторы по умолчанию, и на этом все. Например, вы можете увидеть в реализации libstdc++ что constexpr
появляется только один раз во всем файле. LWG, вызвавшая это изменение, называлась #1129. В нем говорится:
istream_iterator
иistreambuf_iterator
должны поддерживать буквальные контрольные значения. Конструктор по умолчанию часто используется для завершения диапазонов и может легко быть буквальным значением дляistreambuf_iterator
иistream_iterator
при повторении типов значений. [Остальные опущены]
Это не имеет большого смысла для меня. Может ли кто-нибудь показать мне пример того, что они означают?
N3308 — еще один документ, в котором упоминается, но не объясняет проблему:
Некоторые из конструкторов
istream_iterator<T>
должны бытьconstexpr
, еслиT
является буквальным типом. Цель состоит в том, чтобы позволить существующему методу реализации сохранения встроенного типаT
продолжать работать. [libstdc++ делает это,_Tp _M_value
] Однако на самом деле это исключает эту технику: конструкторы по умолчанию и конструкторы копированияT
не должны быть помеченыconstexpr
, а если это не так, конструкторыistream_iterator<T>
не могут быть созданы какconstexpr
.
Вышеприведенное объясняет тривиальный конструктор копирования и деструктор, но не объясняет, почему конструктор по умолчанию помечен как constexpr.
Кроме того, тестируя GCC 5.2.0 онлайн, я скопировал реализацию libstdc++. Единственное изменение — я удалил constexpr из istream_iterator()
. В обоих случаях сборки идентичны.
while (iter != istream_iterator())
. Имея это какconstexpr
, мы могли бы сэкономить наносекунду или две в цикле. - person Bo Persson   schedule 19.09.2015constexpr
, если только конечный итератор может бытьconstexpr
? (Кроме того, я не верю, что сэкономленные нам наносекунды или две оправдали бы дефект, статью, а затем разработчиков библиотек, которые думают, что это стоит времени на разработку) - person user5353075   schedule 19.09.2015constexpr
(и это в любом случае не будет работать как условие цикла), но сравнениеiter
с константой может быть дешевле, чем сравнение с чем-то другим. - person Bo Persson   schedule 19.09.2015constexpr
разрешить постоянную инициализацию на этапе статической инициализации? можно ли статически инициализировать временные локальные объекты с нестатической продолжительностью хранения? - person Piotr Skotnicki   schedule 19.09.2015constexpr
просто может помочь компилятору с расчетной частью. В данном конкретном случае, я полагаю, большинство оптимизаторов заметили, чтоistream_iterator()
создает константу еще до того, как она была преобразована вconstexpr
. Так что это не важное изменение в библиотеке. - person Bo Persson   schedule 19.09.2015constexpr
приведет к созданию идентичных сборок. Я снова не убежден, что эта микрооптимизация является истинной причиной. - person user5353075   schedule 19.09.2015constexpr
, кто-то создал в стандартной библиотеке список вещей, которые можно сделатьconstexpr
. В этом случае изменение чрезвычайно просто сделать, оно не нарушает работу старого кода, а если оно каким-то образом влияет на производительность, то, по крайней мере, не отрицательно. Так почему бы не? - person Bo Persson   schedule 19.09.2015std::mutex
constexpr решит статическую инициализацию (#828) проблема, но это единственная проблема, перечисленная в N2976, которая упоминает статическую инициализацию. Я считаю, что проблема связана с созданиемistream_iterator
буквального типа, как и большинство других проблем. Однако у меня возникли проблемы с соединением точек. - person user5353075   schedule 19.09.2015istream_iterator
constexpr. - person user5353075   schedule 19.09.2015