"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que `static_assert` se comporta de maneira diferente com parâmetros de modelo sem tipo em compiladores?

Por que `static_assert` se comporta de maneira diferente com parâmetros de modelo sem tipo em compiladores?

Publicado em 2024-11-09
Navegar:179

Why Does `static_assert` Behave Differently with Non-Type Template Parameters Across Compilers?

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 {};
Tutorial mais recente Mais>

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