¿Qué partes de la Biblioteca estándar C++14 podrían ser y qué partes se convertirán en constexpr?


Con el nuevo reglas C++14 constexpr relajadas, la programación en tiempo de compilación se vuelve mucho más expresiva. Me pregunto si la Biblioteca Estándar también se actualizará para aprovecharla. En particular, std::initializer_list, std::pair, std::tuple, std::complex, std::bitset y std::array parecen candidatos principales para ser marcados constexpr al por mayor.

Preguntas:

  • que partes de la Biblioteca Estándar se ahora ser marcado constexpr?
  • qué otras partes ¿podría marcarse constexpr?
  • por ejemplo, ¿por qué las funciones de <cmath> y <algorithm> no están marcadas constexpr?
  • ¿hay razones de compatibilidad hacia atrás para no hacerlo?
Author: TemplateRex, 2013-08-05

2 answers

Que partes de la Biblioteca Estándar serán marcadas constexpr?

Del borrador que he visto para C++14, N3690 , lo siguiente se cambiará a constexpr hasta ahora (En comparación con el estándar C++11)†:

  • el constructor por defecto de std::error_category
  • std::forward
  • std::move
  • std::move_if_noexcept
  • Todas las comparaciones de operadores de std::pair
  • std::get para std::pair y std::tuple.
  • std::make_tuple
  • Todos los std::tuple comparaciones de operadores
  • Todas las comparaciones de operadores de std::optional
  • Todos los constructores de std::optional (excepto para mover)
  • operator[] y size para std::bitset y otros recipientes.
  • Todas las comparaciones de operadores de std::complex

Como hice esto manualmente, puede esperar algunos errores :(

Para otra lista posiblemente más correcta de constexpr adiciones puede consultar: N3469, N3470 , y N3471

¿Qué otras partes podrían marcarse como constexpr?

La mayoría de las cosas que podrían ser constexpr (std::numeric_limits evaluación, std::tuple y std::pair constructores, etc) ya estaban marcados como constexpr en el estándar C++11. Hubo un error en el que los puntos de tiempo de std::ratio y otros componentes no estaban marcados como constexpr, pero se solucionó en N3469.

Algo que se beneficiaría de las adiciones constexpr sería std::initializer_list, que no obtuvo ninguna esta vez (y no estoy seguro de si ha habido alguna propuestas para permitirlo).

¿Hay razones de compatibilidad hacia atrás para no hacerlo?

Dado que esta es una extensión , la mayoría de las cosas no se romperán, ya que el código anterior seguirá compilándose tal cual y nada está mal formado. Sin embargo, agregar constexpr a cosas más antiguas que no lo tenían podría conducir a algunos resultados sorprendentes si no lo esperabas, como el ejemplo proporcionado aquí (Thanks TemplateRex)

 26
Author: Rapptz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-05 19:54:16

La semana pasada (23-28 de septiembre de 2013) el comité de estándares agregó constexpr a más rutinas en la biblioteca estándar.

  • forward_as_tuple
  • el método operator () de todos los operadores con nombre de comparación / lógico / bitwise. (less, greater, plus, minus, bitwise_and, logical_or, not1 - y el resto)

@TemplateRex: Nos estamos acercando a ordenar matrices en tiempo de compilación.

Sin embargo, también resolvimos el problema LWG 2013, indicando que los implementadores de bibliotecas estándar NO tener la libertad de hacer llamadas que no están definidas en el estándar como constexpr como constexpr, ya que ese tipo de diferencia entre implementaciones podría cambiar el comportamiento de algún código.

 4
Author: Marshall Clow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-01 19:18:33