que - librerias de dev c++ y sus funciones
¿Qué partes de la biblioteca estándar C++ 14 podrían ser y qué partes se harán constestables? (2)
¿Qué partes de la Biblioteca estándar ahora se marcarán constexpr?
Desde el borrador que he analizado para C ++ 14, N3690 , lo siguiente será cambiado a constexpr
hasta el momento (en comparación con el estándar C ++ 11) †:
- El constructor predeterminado 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
- Todas las comparaciones de operador de
std::tuple
- Todas las comparaciones de operadores de
std::optional
- Todos los constructores de
std::optional
(guardar para mover) -
operator[]
ysize
parastd::bitset
y otros contenedores. - Todas las comparaciones de operadores de
std::complex
† Como hice esto manualmente, puede esperar algunos errores :(
Para obtener otra lista posiblemente más correcta de constexpr
de constexpr
, puede consultar: N3469 , N3470 y N3471
¿Qué otras partes podrían marcarse constexpr?
La mayoría de las cosas que podrían ser constexpr
( std::numeric_limits
evaluation, std::tuple
y std::pair
constructors, etc.) ya estaban marcadas 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 se marcaron como constexpr
pero se corrigió en N3469.
Algo que se beneficiaría de las constexpr
de constexpr
sería std::initializer_list
, que esta vez no obtuvo ninguno (y no estoy seguro si ha habido alguna propuesta para permitirlo).
¿Hay razones de compatibilidad hacia atrás para no hacerlo?
Como se trata de una extensión , la mayoría de las cosas no se romperán, ya que el código anterior aún se compilará como está y nada está ahora mal formado. Sin embargo, agregar constexpr
a las cosas más antiguas que no lo tenían podría llevar a algunos resultados sorprendentes si no lo esperaba, como el ejemplo proporcionado aquí (Gracias TemplateRex)
Con las nuevas y relajadas reglas constexpr de C ++ 14 , 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 constexpr
mayor.
Preguntas :
- ¿
constexpr
partes de la Biblioteca estándar ahora se marcaránconstexpr
? - ¿
constexpr
otras partes podrían marcarseconstexpr
? - por ejemplo, ¿por qué las funciones de
<cmath>
y<algorithm>
marcadas comoconstexpr
? - ¿Hay razones de compatibilidad hacia atrás para no hacerlo?
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 / bit a bit. (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 de LWG 2013, afirmando que los implementadores de bibliotecas estándar NO tienen la libertad de realizar 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.