ホームページ > バックエンド開発 > C++ > C 20 で `constexpr std::vector` および `constexpr std::string` を使用するとコンパイラ エラーが発生するのはなぜですか?

C 20 で `constexpr std::vector` および `constexpr std::string` を使用するとコンパイラ エラーが発生するのはなぜですか?

Barbara Streisand
リリース: 2024-12-01 11:48:10
オリジナル
535 人が閲覧しました

Why Do I Get Compiler Errors When Using `constexpr std::vector` and `constexpr std::string` in C  20?

C 20 の Constexpr ベクトルと文字列: コンパイラ エラーの解決

constexpr std::string および std::vector オブジェクトを作成しようとしたときを使用すると、式に定数値が欠落していることを示すコンパイラ エラーが発生する場合があります。 constexpr 文字列とベクトルをサポートする最新の Microsoft Visual Studio 2019 バージョンを使用しているにもかかわらず、このエラーが続く可能性があります。

一時的な割り当てと非一時的な割り当て

問題これは、C 20 での constexpr 割り当てサポートが一時的な割り当てに限定されているという事実から生じます。一時的な割り当ては、定数の評価の終了によって割り当てが解除され、割り当ての永続化が防止されます。

あなたの場合、 std::vector と std::string の使用には、非一時的な動的メモリ割り当てが含まれます。 。したがって、コンパイラはこれに一時的な割り当て制限の違反としてフラグを立てます。

constexpr std::vector cv{ 1, 2, 3 };
ログイン後にコピー

Constexpr 内の一時的な割り当ての解決策

この問題を解決するには、ベクトルまたはベクトルを使用します。 constexpr 内の文字列では、割り当てが一時的であることを確認してください。これは、定数の評価が終了する前にメモリ割り当てを完全に解放する必要があることを意味します。

たとえば、次の例のように、関数を使用して constexpr 内で割り当てを実行できます。

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

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

この場合、関数が戻るときにメモリが割り当て解除されるため、ベクトルの割り当ては一時的です。これにより、constexpr 時に std::vector を使用できるようになります。

以上がC 20 で `constexpr std::vector` および `constexpr std::string` を使用するとコンパイラ エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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