ホームページ >バックエンド開発 >C++ >定数式の C Constexpr 関数で参照パラメータを使用できますか?

定数式の C Constexpr 関数で参照パラメータを使用できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-29 01:54:09661ブラウズ

Can Reference Parameters Be Used in C   Constexpr Functions for Constant Expressions?

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

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