constexpr と C 20 の std::vector および std::string の動的メモリ割り当ての非互換性を理解する
ドキュメントでサポートが示されているにもかかわらずMicrosoft Visual Studio の constexpr std::string および std::vector の場合2019 バージョン 16.11.4 では、ユーザーが constexpr を使用してこれらのオブジェクトを作成しようとすると、エラーが発生する可能性があります。この理由は、C 20 での constexpr 割り当てのサポートが制限されていることにあります。
C 20 では、constexpr の評価中に一時的な割り当てが許可されています。これは、定数評価中に割り当てられたメモリは、その結果によって完全に割り当て解除される必要があることを意味します。ただし、ベクトルと文字列はメモリを動的に割り当てるため、定数評価の範囲を超えて持続する可能性があり、このルールに違反します。
「式には定数値が必要です」というエラー メッセージは、コンパイラが割り当てられたメモリが定数値であることを保証できないことを示します。メモリは constexpr の評価が終了するまでに割り当て解除されます。その結果、constexpr std::vector および std::string オブジェクトの作成試行は失敗します。
対照的に、std::array は動的メモリ割り当てを必要とせず、有効期間が保証されているため、constexpr とともに使用できます。
この問題に対処するには、constexpr オブジェクトの有効期間が一時的な場合にのみ作成を試みるようにしてください。つまり、定数評価の終了までに完全に割り当てが解除されます。この制限により、constexpr コンテキスト内での動的メモリ割り当ての使用が制限されます。
以上がC 20 で `constexpr` を `std::vector` および `std::string` と一緒に使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。