En las funciones constexpr de C ++ 11, una segunda declaración como una assert()
no es posible. A static_assert()
está bien, pero no funcionaría si la función se llama como función 'normal'. El operador de coma podría venir a ayudar a wrto. el assert()
, pero es feo y algunas herramientas escupen advertencias al respecto.
Considere tal 'getter' que es perfectamente comprensible al lado de la afirmación. Pero me gustaría mantener algún tipo de afirmación para el tiempo de ejecución y el tiempo de compilación, pero no puedo sobrecargarlo dependiendo del contexto 'constexpr'.
template<int Size>
struct Array {
int m_vals[Size];
constexpr const int& getElement( int idx ) const
{
ASSERT( idx < Size ); // a no-go for constexpr funcs in c++11
// not possible, even in constexpr calls as being pointed out, but what I would like:
static_assert( idx < Size, "out-of-bounds" );
return m_vals[idx];
}
};
Condiciones secundarias: C ++ 11, sin montón, sin excepciones, sin detalles del compilador.
Tenga en cuenta que los comentaristas señalaron (¡gracias!), static_assert
Sobre el argumento no es posible (pero sería bueno). El compilador me dio un error diferente en el acceso fuera de límites en esa situación.
static_assert
dependiente idx
en absoluto. Solo puede diagnosticar un valor incorrecto de idx
si la función se usa en un contexto que requiere una expresión constante, al forzar la evaluación de una construcción que la convierte en una expresión no constante. Fuera de dicho contexto, nunca puede verificar el valor en tiempo de compilación.