次の方法で共有


コンパイラ エラー C2338

エラー メッセージ

エラー C2338 は、コンパイル中の static_assert エラーが原因で発生する可能性があります。 メッセージは static_assert パラメーターによって提供されます。

エラー C2338 は、コンパイラに対する外部プロバイダーによっても生成される場合があります。 ほとんどの場合、これらのエラーは属性プロバイダー DLL (ATLPROV など) によって報告されます。 このメッセージには、次のような一般的な形式があります。

  • 'attribute' Atl 属性プロバイダー : エラー ATLnumbermessage

  • 属性 'attribute' の使い方に誤りがあります

  • 'usage': 属性 'usage' の形式が正しくありません

多くの場合、これらのエラーは回復不可能であり、致命的なコンパイラ エラーが続く可能性があります。

これらの問題を解決するには、属性の使用を修正します。 たとえば、属性パラメーターを使用する前に宣言する必要がある場合があります。 ATL エラー番号が指定されている場合は、そのエラーのドキュメントで詳細な情報を確認してください。

標準 C++11 以降では、constexpr 関数が定数式で使用される場合、既定では noexcept と見なされなくなりました。 この動作変更は、Core Working Group (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");
}