Compartilhar via


Erro do compilador C2338

Mensagem de erro

O erro C2338 pode ser causado por um erro de static_assert durante a compilação. A mensagem é fornecida pelos parâmetros static_assert.

O erro C2338 também pode ser gerado por provedores externos ao compilador. Na maioria dos casos, esses erros são relatados por uma DLL do provedor de atributos, como ATLPROV. Algumas formas comuns desta mensagem incluem:

  • Provedor de atributo 'attribute' Atl: erro de ATL númeromensagem

  • Uso incorreto do atributo 'attribute'

  • 'usage': formato incorreto para o atributo 'usage'

Esses erros geralmente são irrecuperáveis e podem receber um erro fatal do compilador.

Para corrigir esses problemas, corrija o atributo usage. Por exemplo, em alguns casos, os parâmetros de atributo devem ser declarados antes que possam ser usados. Se for fornecido um número de erro de ATL, verifique a documentação desse erro para obter informações mais específicas.

No Standard C++11 e posterior, as funções constexpr não são mais consideradas noexcept por padrão quando usadas em uma expressão constante. Essa alteração de comportamento vem da resolução do CWG (Grupo de Trabalho Principal) CWG 1351 e está habilitada no modo /permissive-. O exemplo a seguir é compilado no Visual Studio 2019 versão 16.1 e anteriores, mas produz C2338 no Visual Studio 2019 versão 16.2:

// c2338.cpp
// Compile using: cl /EHsc /W4 /permissive- c2338.cpp
constexpr int f() { return 0; }

int main() {
    static_assert(noexcept(f()), "f should be noexcept"); // C2338 in 16.2
}

Para corrigir o erro, adicione a expressão noexcept à declaração de função:

// c2338_fixed.cpp
// Compile using: cl /EHsc /W4 /permissive- c2338_fixed.cpp
constexpr int f() noexcept { return 0; }

int main() {
    static_assert(noexcept(f()), "f should be noexcept");
}