编译器错误 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");
}