Partager via


Erreur du compilateur C2338

Message d’erreur

L’erreur C2338 peut être due à une erreur static_assert lors de la compilation. Le message est fourni par les paramètres static_assert.

L’erreur C2338 peut également être générée par des fournisseurs externes au compilateur. Dans la plupart des cas, ces erreurs sont signalées par une DLL de fournisseur d’attributs, comme ATLPROV. Voici quelques formes courantes de ce message :

  • « attribut » – Fournisseur d’attributs ATL : erreur ATLnuméro message

  • Utilisation incorrecte de l’attribut « attribut »

  • « ’utilisation » : format incorrect « utilisation » de l’attribut

Ces erreurs sont souvent irrécupérables et peuvent être suivies d’une erreur irrécupérable du compilateur.

Pour résoudre ces problèmes, corrigez l’utilisation de l’attribut. Par exemple, dans certains cas, les paramètres d’attribut doivent être déclarés avant de pouvoir être utilisés. Si un numéro d’erreur ATL est fourni, consultez la documentation relative à cette erreur pour obtenir des informations plus spécifiques.

Dans C++11 standard et ultérieur, les fonctions constexpr ne sont plus considérées par défaut comme noexcept quand elles sont utilisées dans une expression de constante. Ce changement de comportement provient de la résolution du CWG (Core Working Group) CWG 1351 et est activé en mode /permissive-. L’exemple suivant se compile dans Visual Studio 2019 versions 16.1 et antérieures, mais génère une erreur C2338 dans Visual Studio 2019 version 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
}

Pour corriger l’erreur, ajoutez l’expression noexcept à la déclaration de fonction :

// 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");
}