Comportamento inconsistente de static_assert com parâmetros de modelo sem tipo entre compiladores
Em C , um static_assert pode ser usado para verificar condições em tempo de compilação . No entanto, uma observação recente revelou uma disparidade no comportamento de static_assert quando usado em conjunto com parâmetros de modelo sem tipo em diferentes compiladores.
Especificamente, o seguinte trecho de código:
template
struct Hitchhiker {
static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};
template
struct Hitchhiker {};
se comporta de maneira diferente no Clang e no GCC ao tentar desabilitar a instanciação geral do modelo usando static_assert. Clang aciona o erro de afirmação mesmo quando o modelo não é instanciado, enquanto o GCC apenas gera o erro na instanciação com um valor de parâmetro diferente de 42.
Para entender a discrepância, vamos explorar a seção relevante do padrão C ( [temp.res]/8):
If no valid specialization can be generated for a template, and that template is not instantiated, the template is ill-formed, no diagnostic required.
De acordo com esta regra, o modelo primário do Mochileiro está mal formado, pois nenhuma especialização válida pode ser gerada. Como tal, não é necessário emitir um diagnóstico. No entanto, Clang opta por fornecer um diagnóstico apesar da falta de exigência.
Se a intenção é restringir a instanciação a apenas 42, a abordagem recomendada é omitir a definição geral do modelo como segue:
template
struct Hitchhiker {};
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3