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