Constexpr 関数での非定数パラメーターの参照
次の関数テンプレートを考えてみましょう:
template <size_t S1, size_t S2> auto concatenate(const std::array<uint8_t, S1>& data1, const std::array<uint8_t, S2>& data2) { // Error in constexpr contexts due to reference parameter std::array<uint8_t, data1.size() + data2.size()> result; // ... }
Clang 6.0 の使用C 17 では、このコードはエラーでコンパイルに失敗します。 「非型テンプレート引数は定数式ではありません。」 constexpr 関数内での参照の評価は、潜在的なエイリアシングの問題により問題が発生します。
標準について
C 標準 ([expr.const]/4) によれば、式が参照として評価される場合、式をコア定数式にすることはできませんそれ:
解決策
この問題を解決するには、問題のある参照パラメータを対応するテンプレートで置き換えることができます。パラメータ:
template <size_t S1, size_t S2> auto concatenate(const std::array<uint8_t, S1>& data1, const std::array<uint8_t, S2>& data2) { // Problem solved by using S1 + S2 instead std::array<uint8_t, S1 + S2> result; // ... }
テンプレート パラメータを直接使用することで、constexpr コンテキストで参照を評価する必要がなくなり、関数を定数式の評価で使用できるようになります。
以上が参照を含む Constexpr 関数での「非型テンプレート引数は定数式ではありません」エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。