共用方式為


編譯器錯誤 C2338

錯誤訊息

錯誤 C2338 可能是編譯期間發生 static_assert 錯誤所造成。 訊息是由 static_assert 參數所提供。

錯誤 C2338 也會由外部提供者對編譯器產生。 在大部分情況下,這些錯誤是由屬性提供者 DLL 所報告,例如 ATLPROV。 此訊息的一些常見形式包括:

  • 'attribute' Atl 屬性提供者 : 錯誤 ATLnumber message

  • 屬性 'attribute' 的使用方式不正確

  • 'usage': 屬性 'usage' 的格式不正確

這些錯誤通常無法復原,後面可能會發生嚴重編譯器錯誤。

若要修正這些問題,請更正屬性使用方式。 例如,在某些情況下,必須先宣告屬性參數,才能使用它們。 如果提供 ATL 錯誤號碼,請檢查該錯誤的文件以取得更具體的資訊。

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