ホームページ >バックエンド開発 >C++ >Constexpr 関数で参照パラメータによってエラーが発生するのはなぜですか?

Constexpr 関数で参照パラメータによってエラーが発生するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-15 17:57:15933ブラウズ

Why Do Reference Parameters Cause Errors in Constexpr Functions?

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

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