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 サイトの他の関連記事を参照してください。