C 20 Constexpr ベクトルと文字列が機能しない?一時的な割り当ての物語
constexpr std::string および std::vector オブジェクトを作成しようとすると、不可解なコンパイラ エラーが発生する場合があります。サポートされている最新の Visual Studio バージョンを使用しているにもかかわらず、「式には定数値が必要です。」というエラー メッセージが表示されます。
問題
提供されたコードは以下を利用します。
constexpr std::string cs{ "hello" }; constexpr std::vector cv{ 1, 2, 3 };
しかし、コンパイラは、不足していることを示唆して文句を言います。
解決策
この問題は、C 20 の constexpr 割り当てのサポートが制限されていることが原因で発生します。具体的には、一時的な割り当てが必要です。これは、定数の評価中に割り当てられたメモリは、評価が完了する前に割り当てを解除する必要があることを意味します。
ベクトルは、動的メモリ割り当ての性質上、評価後もメモリが保持されるため、定数として保存できません。したがって、「定数の評価中にヒープが割り当てられたメモリを指す」というエラーが発生します。
一時的な割り当ての例
ベクトルは定数として宣言できませんが、定数として宣言することはできます。一時的な割り当てを伴う constexpr 関数中に使用されます:
constexpr int f() { std::vector<int> v = {1, 2, 3}; return v.size(); } static_assert(f() == 3);
このコードでは、ベクトルのメモリはf() が返されると割り当てが解除され、割り当てが一時的になり、constexpr 関数で使用できるようになります。
以上がC 20 の「constexpr」「std::vector」および「std::string」がコンパイルに失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。