Constexpr 関数の参照パラメータに関する混乱
以下のコード スニペットは、constexpr 関数内の 2 つのバイト配列を新しい配列に連結しようとしています。
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 occurs here // ... }
ただし、コンパイル時にはC 17 標準を使用する Clang 6.0 では、「非型テンプレート引数は定数式ではありません」というエラーが発生します。このエラーは、関数パラメーター (data1 および data2) の参照の性質に起因します。
C 標準の [expr. const]/4:
"式 e は、e... の評価が参照型の変数またはデータ メンバーを参照する id 式を評価しない限り、コア定数式です。 "
この場合の参照パラメーターには先行する初期化がないため、定数式で使用できません。
この問題を修正するには、コードを変更できます。参照パラメータの size() メンバー関数に依存する代わりに、S1 および S2 テンプレート パラメータを直接利用するには:
std::array<uint8_t, S1 + S2> result;
以上がConstexpr 関数で参照パラメータによってエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。