С новым смягченные правила constexpr в C ++ 14, программирование во время компиляции становится намного более выразительным. Интересно, будет ли также улучшена Стандартная библиотека, чтобы воспользоваться ее преимуществами? Особенно, std::initializer_list
, std::pair
, std::tuple
, std::complex
, std::bitset
а также std::array
кажутся первыми кандидатами, которые будут отмечены constexpr
оптовая.
Вопросы:
constexpr
? constexpr
? <cmath>
а также <algorithm>
отмеченный constexpr
? какие части стандартной библиотеки теперь будут помечены как constexpr?
Из проекта, который я посмотрел на C ++ 14, N3690, следующее будет изменено на constexpr
до настоящего времени (по сравнению со стандартом C ++ 11) †:
std::error_category
конструктор по умолчаниюstd::forward
std::move
std::move_if_noexcept
std::pair
оператор сравненияstd::get
за std::pair
а также std::tuple
,std::make_tuple
std::tuple
оператор сравненияstd::optional
оператор сравненияstd::optional
конструкторы (сохранить на ходу)operator[]
а также size
за std::bitset
и другие контейнеры.std::complex
оператор сравнения† Так как я сделал это вручную, вы можете ожидать некоторые ошибки 🙁
Для другого, возможно, более правильного списка constexpr
дополнения вы можете проверить: N3469, N3470, а также N3471
какие другие части можно пометить constexpr?
Большинство вещей, которые могут быть constexpr
(std::numeric_limits
оценка, std::tuple
а также std::pair
конструкторы и т. д.) уже были помечены как constexpr
в стандарте C ++ 11. Была ошибка в которой std::ratio
моменты времени и другие компоненты не были помечены как constexpr
но это было исправлено в N3469.
Что-то, что выиграет от constexpr
дополнения будут std::initializer_list
, который не получил в этот раз (и я не уверен, были ли какие-либо предложения, чтобы позволить это).
есть ли причины обратной совместимости не делать этого?
Так как это расширение, большинство вещей не будет сломано, так как старый код все равно будет скомпилирован как есть, и теперь ничто не плохо сформировано. Однако добавление constexpr
к более старым вещам, у которых этого не было, это может привести к неожиданным результатам, если вы этого не ожидали, например, к примеру предоставлено здесь (Спасибо TemplateRex)
На прошлой неделе (23-28 сентября 2013 г.) комитет по стандартам добавил constexpr
больше процедур в стандартной библиотеке.
operator ()
метод всех операторов сравнения / логических / побитовых имен. (less
, greater
, plus
, minus
, bitwise_and
, logical_or
, not1
— и остальное)@TemplateRex: мы приближаемся к сортировке массивов во время компиляции.
Тем не менее, мы также решили проблему LWG 2013, заявив, что разработчики стандартной библиотеки НЕ имеют права делать вызовы, которые не определены в стандарте, как constexpr
как constexpr
, поскольку такая разница между реализациями может изменить поведение некоторого кода.