ホームページ >バックエンド開発 >C++ >参照パラメータを含む `constexpr` 関数で `data1.size()` が機能しないのはなぜですか?

参照パラメータを含む `constexpr` 関数で `data1.size()` が機能しないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-29 07:53:13611ブラウズ

Why Doesn't `data1.size()` Work in a `constexpr` Function with Reference Parameters?

参照パラメータを使用した Constexpr 関数の定数式

次のコード スニペットを考えてみましょう。

template <size_t S1, size_t S2>
auto concatenate(const std::array<uint8_t, S1> &data1,
                 const std::array<uint8_t, S2> &data2)
{
    std::array<uint8_t, data1.size() + data2.size()> result; // Error: non-type template argument is not a constant expression
    ...
}

次を使用してコンパイルした場合Clang 6.0 で -std=c 17 を指定すると、関数は次の理由でコンパイルに失敗します。配列の size メンバー関数が参照に適用されたときに constexpr にならないようにします。

標準理論

この動作の理由は [expr.const] で説明されています。 C 標準の /4:

  • 式が評価される場合、式はコア定数式ではありません参照型の変数またはデータ メンバーを参照する ID 式。次の場合を除きます。

    • 参照には先行する初期化があり、定数式で使用できます
    • 参照の有効期間が開始されました式の評価内で

この場合、参照パラメータ data1 には先行するパラメータがありません。この問題を解決するには、単に data1 を置き換えるだけです。 size() とテンプレートパラメータ S1:

以上が参照パラメータを含む `constexpr` 関数で `data1.size()` が機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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