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