2011-12-24 12 views
44

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

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

Esto no es válido el código C++ 11, porque una función constexpr sólo debe contener una instrucció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.

Respuesta

52

Este código no es válido para 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. ¿Qué es no bien está utilizando parámetros de funciones en expresiones constantes, como lo haces.

Podrías tirar si x <= 0. A la función en un contexto que requiere una expresión constante luego dejar de compilar

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

fresca, que no sabía '' throw's en una función constexpr' que se llama en un contexto constexpr hará que la compilación falle! – Xeo

+16

@Xeo haciendo * cualquier cosa * no constexpressy en el otro lado de?: Hará el trabajo. :) –

+0

Buen complemento para 'static_assert' Debo decir. :) – Xeo

20

Esto funciona y es válido el código C++ 11, debido a argumentos de plantilla son sólo el tiempo de compilación:

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

I enfrentado con los mismos problemas que con 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 las 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 de acuerdo a la norma: 7.1.3 estados

... o un compuesto que contiene afirmación de que sólo

  • declaraciones nulos,
  • static_assert -declarations
  • declaraciones de tipodef y declaraciones de alias que no
    definen clases o enumeraciones,
  • utilizando-declaraciones,
  • utilizando Directivas,
  • y exactamente un retorno comunicado
+1

No. Constexpr debe ser solo una declaración de devolución única. –

+1

¿De verdad? Esto funciona para mi. ¿Qué estoy haciendo mal? http://ideone.com/3GOk7Q – cppist

+1

Leí el estándar. Estás en lo cierto, esto está bien. Edité tu respuesta para agregar eso. –

Cuestiones relacionadas