Какие части стандартной библиотеки C ++ 14 могут быть и какие части будут сделаны constexpr?

С новым смягченные правила constexpr в C ++ 14, программирование во время компиляции становится намного более выразительным. Интересно, будет ли также улучшена Стандартная библиотека, чтобы воспользоваться ее преимуществами? Особенно, std::initializer_list, std::pair, std::tuple, std::complex, std::bitset а также std::array кажутся первыми кандидатами, которые будут отмечены constexpr оптовая.

Вопросы:

  • какие части стандартной библиотеки будут теперь отметиться constexpr?
  • какие другие части мог быть отмеченным constexpr?
  • например почему не функции из <cmath> а также <algorithm> отмеченный constexpr?
  • есть ли причины обратной совместимости не делать этого?

32

Решение

какие части стандартной библиотеки теперь будут помечены как 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)

26

Другие решения

На прошлой неделе (23-28 сентября 2013 г.) комитет по стандартам добавил constexpr больше процедур в стандартной библиотеке.

  • forward_as_tuple
  • operator () метод всех операторов сравнения / логических / побитовых имен. (less, greater, plus, minus, bitwise_and, logical_or, not1 — и остальное)

@TemplateRex: мы приближаемся к сортировке массивов во время компиляции.

Тем не менее, мы также решили проблему LWG 2013, заявив, что разработчики стандартной библиотеки НЕ имеют права делать вызовы, которые не определены в стандарте, как constexpr как constexpr, поскольку такая разница между реализациями может изменить поведение некоторого кода.

4

По вопросам рекламы [email protected]