and c++ c++11 static-assert constexpr

and - C++ 11-static_assert dentro de la función constexpr?



difference between const and constexpr in c++ (2)

¿Cómo se podría hacer correctamente un static_assert dentro de una función constexpr ? Por ejemplo:

constexpr int do_something(int x) { static_assert(x > 0, "x must be > 0"); return x + 5; }

Este no es un código válido de C ++ 11, porque una función constexpr solo debe contener una declaración de retorno. No creo que el estándar tenga una excepción, aunque el GCC 4.7 no me permite compilar este código.


Este no es un código válido de C ++ 11, porque una función constexpr solo debe contener una declaración de retorno.

Esto es incorrecto. static_assert en una función constexpr están bien. Lo que no está bien es usar parámetros de funciones en expresiones constantes, como lo haces.

Podrías tirar si x <= 0 . Llamar a la función en un contexto que requiere una expresión constante no compilará

constexpr int do_something(int x) { return x > 0 ? (x + 5) : (throw std::logic_error("x must be > 0")); }


Esto funciona y es un código válido de C ++ 11, porque los argumentos de la plantilla son solo de tiempo de compilación:

template <int x> constexpr int do_something() { static_assert(x > 0, "x must be > 0"); return x + 5; }

Me enfrenté a los mismos problemas que a las expresiones constantes en C ++. Hay poca documentación clara sobre constexprs en este momento. Y tenga en cuenta que hay algunos errores conocidos en el rastreador de problemas de gcc, pero su problema no parece ser un error.

Tenga en cuenta que si declara funciones constexpr dentro de las clases, no podrá usarlas dentro de la clase. Esto también parece no ser un error.

Editar: Esto está permitido según el estándar: 7.1.3 estados

... o una declaración compuesta que contiene solo

  • declaraciones nulas,
  • static_assert -declarations
  • typedef declaraciones y alias-declaraciones que no
    definir clases o enumeraciones,
  • uso-declaraciones,
  • using-directives,
  • y exactamente una declaración de devolución