Pregunta ¿Qué partes de la biblioteca estándar C ++ 14 podrían ser y qué partes se harán constestables?


Con el nuevo reglas relajadas C ++ 14 constexpr, 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 ser candidatos principales para ser marcados constexpr venta al por mayor.

Preguntas:

  • qué partes de la biblioteca estándar será ahora se marcará constexpr?
  • cuales otras partes podría ser marcado constexpr?
  • p.ej. por qué no son las funciones de <cmath> y <algorithm> marcado constexpr?
  • ¿Hay razones de compatibilidad hacia atrás para no hacerlo?

32
2017-08-05 06:57


origen


Respuestas:


¿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) †:

  • std::error_categoryconstructor por defecto
  • std::forward
  • std::move
  • std::move_if_noexcept
  • Todo std::paircomparaciones de operadores
  • std::get para std::pair y std::tuple.
  • std::make_tuple
  • Todo std::tuplecomparaciones de operadores
  • Todo std::optionalcomparaciones de operadores
  • Todo std::optionalconstructores de s (guardar para mover)
  • operator[] y size para std::bitset y otros contenedores.
  • Todo std::complexcomparaciones de operadores

Como lo hice manualmente, puede esperar algunos errores :(

Para otra lista posiblemente más correcta de constexpr adiciones que puedes verificar: N3469, N3470y N3471

¿Qué otras partes podrían marcarse 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 cual std::ratioLos puntos de tiempo y otros componentes no se marcaron como constexpr pero fue arreglado en N3469.

Algo que se beneficiaría de constexpr las adiciones serían 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?

Dado que esto es un extensión, la mayoría de las cosas no se romperán ya que el código anterior aún compilará como está y nada está ahora mal formado. Sin embargo agregando constexpr a las cosas más antiguas que no lo tenían podría llevar a resultados sorprendentes si no lo esperaba, como el ejemplo proporcionado aquí (Gracias TemplateRex)


26
2017-08-05 07: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 operator () método 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 hacer llamadas que no están definidas en el estándar como constexpr como constexpr, dado que ese tipo de diferencia entre las implementaciones podría cambiar el comportamiento de algún código.


4
2017-10-01 19:18