¿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 marcadasconstexpr
? - ¿hay razones de compatibilidad hacia atrás para no hacerlo?
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
parastd::pair
ystd::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[]
ysize
parastd::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)
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.
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