ホームページ >バックエンド開発 >C++ >C 20 の `constexpr` `std::vector` および `std::string` が動作しないのはなぜですか?

C 20 の `constexpr` `std::vector` および `std::string` が動作しないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-06 10:42:13547ブラウズ

Why Aren't My C  20 `constexpr` `std::vector` and `std::string` Working?

C 20 constexpr Vector と String が機能しない

この問題では、プログラマは std::string と std の constexpr オブジェクトを作成しようとします。 ::vector ですが、式には定数値が必要であるというコンパイラ エラーが発生します。この問題は、constexpr 文字列とベクトルをサポートする最新の Microsoft Visual Studio 2019 バージョンを使用しているにもかかわらず発生します。

問題の説明

このエラーは、constexpr 割り当てサポートが制限されていることが原因で発生します。 C 20。一時的な割り当てのみが可能です。一時的な割り当てでは、定数評価の終了までに、割り当てられたメモリが完全に割り当て解除される必要があります。

無効なコードの例

次の例は、エラーを示しています:

int main() {
    constexpr std::vector<int> v = {1, 2, 3};
}

ここでは、v の割り当ては持続し、非一時的になります。コンパイラーは、定数の評価中に v がヒープ割り当てを保持するため、式が定数として評価されなかったことを示すエラーを正しく生成します。

有効なコードの例

ただし、 constexpr 時間中に std::vector を使用することは、一時的な割り当てで可能です。

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

static_assert(f() == 3);

この例では、 f() が返されるとメモリの割り当てが解除されるため、v の割り当ては一時的です。これにより、constexpr 時に std::vector を使用できるようになります。

以上がC 20 の `constexpr` `std::vector` および `std::string` が動作しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。