Constexpr 関数と定数式の参照パラメーター
C では、定数式はコンパイル時に定数値として評価される式です。時間。次の 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; // Possible error here return result; }
-std=c 17 を指定して Clang 6.0 を使用してこの関数をコンパイルすると、実行時に data1.size() 式が評価されるためコンパイルに失敗します。このエラーは、パラメータが参照である場合にのみ発生し、constexpr 関数の参照パラメータの動作に関する潜在的な誤解を示しています。
C 標準 ([expr.const]/4) によれば、式はコアです。定数式 (その評価に参照型の変数またはデータ メンバーを参照する id 式の評価が含まれない場合)。 ただし、定数式で使用できる先行初期化が存在するか、その有効期間がコア定数の評価内で開始された場合を除きます。 expression.
指定された関数では、参照パラメーターに先行する初期化がないため、size() 式が非定数になります。したがって、これらを定数式で使用することはできず、コンパイル エラーが発生します。
この問題を解決して定数式で参照パラメータを使用するには、単純に先行する初期化を行うか、data1.size( を置き換えます) ことができます。 ) テンプレートパラメータ S1 を使用します。
以上が定数式の C Constexpr 関数で参照パラメータを使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。