Compartir a través de


Error del compilador C2338

Mensaje de error

El error C2338 puede deberse a un error de static_assert durante la compilación. Los parámetros de static_assert proporcionan el mensaje.

El error C2338 también lo pueden generar proveedores externos al compilador. En la mayoría de los casos, estos errores los notifica el archivo DLL de un proveedor de atributos, como ATLPROV. Algunas formas comunes de este mensaje son:

  • 'atributo' Proveedor de atributos ATL: error ATLnúmero mensaje

  • Uso incorrecto del atributo 'atributo'

  • 'uso': formato incorrecto para el atributo 'usage'

Estos errores suelen ser irrecuperables y pueden ir seguidos de un error irrecuperable del compilador.

Para corregir estos problemas, corrija el uso del atributo. Por ejemplo, en algunos casos, deben declararse los parámetros del atributo para poder usarlos. Si se proporciona un número de error ATL, consulte la documentación de ese error para obtener información más específica.

En C++11 Standard y versiones posteriores, las funciones constexpr ya no se consideran noexcept de forma predeterminada cuando se usan en una expresión constante. Este cambio de comportamiento procede de la resolución del grupo de trabajo principal (CWG) CWG 1351 y está habilitado en /permissive-. El ejemplo siguiente se compila en la versión 16.1 de Visual Studio 2019 y en versiones anteriores, pero se genera C2338 en la versión 16.2 de Visual Studio 2019:

// 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 corregir el error, agregue la expresión noexcept a la declaración de la función:

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