参照パラメータを使用した 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 サイトの他の関連記事を参照してください。