ホームページ >バックエンド開発 >C++ >参照を含む Constexpr 関数での「非型テンプレート引数は定数式ではありません」エラーを解決するにはどうすればよいですか?

参照を含む Constexpr 関数での「非型テンプレート引数は定数式ではありません」エラーを解決するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-04 02:30:09549ブラウズ

How Can I Resolve

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 サイトの他の関連記事を参照してください。

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