Nas funções constexpr do C ++ 11, uma segunda instrução como uma assert()
não é possível. A static_assert()
é bom, mas não funcionaria se a função fosse chamada como função 'normal'. O operador de vírgula pode vir para ajudar. o assert()
, mas é feio e algumas ferramentas cospem avisos sobre ele.
Considere esse 'getter' que é perfeitamente possível ao lado da afirmação. Mas eu gostaria de manter algum tipo de asserção para tempo de execução e tempo de compilação, mas não posso simplesmente sobrecarregar, dependendo do 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];
}
};
Condições secundárias: C ++ 11, sem heap, sem exceções, sem detalhes específicos do compilador.
Observe como os comentaristas apontaram (obrigado!), static_assert
O argumento não é possível (mas seria bom). O compilador me deu um erro diferente no acesso fora dos limites nessa situação.
static_assert
dependente idx
em tudo. Você só pode diagnosticar um valor incorreto idx
se a função for usada em um contexto que exija uma expressão constante, forçando a avaliação de uma construção que a torna não uma expressão constante. Fora desse contexto, você nunca pode verificar o valor em tempo de compilação.