ホームページ > バックエンド開発 > C++ > C 20 の「constexpr」「std::vector」および「std::string」がコンパイルに失敗するのはなぜですか?

C 20 の「constexpr」「std::vector」および「std::string」がコンパイルに失敗するのはなぜですか?

Patricia Arquette
リリース: 2024-12-01 20:05:14
オリジナル
746 人が閲覧しました

Why Are My C  20 `constexpr` `std::vector` and `std::string` Failing Compilation?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート