编译器错误 C2338

错误消息

错误 C2338 可能是由编译期间的 static_assert 错误导致的。 消息由 static_assert 参数提供。

错误 C2338 也可以由编译器的外部提供程序生成。 在大多数情况下,这些错误由属性提供程序 DLL 报告,例如 ATLPROV。 此消息的一些常见形式包括:

  • “attribute”Atl 属性提供程序:错误 ATL“编号”“消息”

  • 属性“attribute”的错误用法

  • “usage”:属性“usage”的格式不正确

这些错误通常是不可恢复的,并且可能会出现编译器错误。

若要解决这些问题,请更正属性用法。 例如,在某些情况下,必须先声明属性参数才能使用。 如果提供了 ATL 错误编号,请检查文档查找该错误以获取更具体的信息。

在标准 C++11 及更高版本中,在常用表达式中使用时,constexpr 函数不再默认为是 noexcept。 此行为更改来自核心工作组 (CWG) CWG 1351 的解析,并在 /permissive- 模式下启用。 以下示例在 Visual Studio 2019 版本 16.1 和更早版本中编译,但在 Visual Studio 2019 版本 16.2 中生成 C2338:

// 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
}

要修复此错误,请将 noexcept 表达式添加到函数声明中:

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