ホームページ > バックエンド開発 > C++ > C 20 の「constexpr」ベクトルと文字列が一時的な割り当てエラーを引き起こすのはなぜですか?

C 20 の「constexpr」ベクトルと文字列が一時的な割り当てエラーを引き起こすのはなぜですか?

Linda Hamilton
リリース: 2024-12-03 06:20:14
オリジナル
307 人が閲覧しました

Why Do `constexpr` Vectors and Strings in C  20 Lead to Transient Allocation Errors?

constexpr C 20 のベクトルと文字列: 一時的な割り当てのジレンマ

C 20 標準ではベクトルと文字列の constexpr サポートが導入されているにもかかわらず、開発者はこれらの constexpr オブジェクトを作成しようとすると、予期しないコンパイラ エラーが発生します。

以下の例では、コンパイラは式に定数値が必要であることを示すエラーを生成します。

#include <vector>
#include <string>

int main()
{
    constexpr std::string cs{ "hello" };
    constexpr std::vector cv{ 1, 2, 3 };
    return 0;
}
ログイン後にコピー

Visual Studio 2019 バージョン 16.11.4 は constexpr ベクトルと文字列の場合、この問題は C 20 の constexpr 割り当ての制限に起因します。 semantics.

constexpr 変数とは異なり、C 20 constexpr コンテナは一時的な割り当てのみをサポートします。これは、定数評価中に割り当てられたメモリは、評価が終了する前に完全に解放される必要があることを意味します。ただし、ベクトルは本質的に動的なメモリ割り当てを必要とするため、この要件を満たす能力が妨げられます。

その結果、ベクトル割り当てが継続するため、このコードは不正な形式であるとみなされます:

constexpr std::vector<int> v = {1, 2, 3};
ログイン後にコピー

ただし、constexpr コンテキストでは一時的な割り当てを引き続き利用できます。次の例を考えてみましょう:

constexpr int f() {
    std::vector<int> v = {1, 2, 3};
    return v.size();
}

static_assert(f() == 3);
ログイン後にコピー

この例では、f() が返されるときにメモリが解放されるため、ベクトルのメモリ割り当ては一時的です。したがって、割り当てが一時的であれば、constexpr の評価中に std::vectors を使用することが許可されます。

以上がC 20 の「constexpr」ベクトルと文字列が一時的な割り当てエラーを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート