ホームページ  >  記事  >  バックエンド開発  >  C は Constexpr の引数に基づいて関数のオーバーロードにどのように対処しましたか?

C は Constexpr の引数に基づいて関数のオーバーロードにどのように対処しましたか?

DDD
DDDオリジナル
2024-10-26 11:49:02183ブラウズ

How Did C   Address Function Overloading Based on Constexpr Arguments?

Constexpr 引数に基づく関数のオーバーロード

引数の constexprness に基づく関数のオーバーロードは、C 11 のプログラマが直面する制限です。これは、意味します。同じシグネチャを持つ 2 つの関数を定義することはできませんが、1 つは constexpr で、もう 1 つは constexpr ではありません。

標準に準拠した C 11 実装では、そのようなオーバーロードは許可されておらず、この制限は意図的に強制されました。ただし、この問題は C 標準の以降のバージョンで認識され、対処されました。

C 17 では、「constexpr lambdas」の概念が導入され、この問題の回避策が提供されました。 Constexpr ラムダを使用すると、コンパイル時に実行でき、constexpr 引数を受け入れることができる匿名関数を作成できます。

さらに、C 20 以降では、「2 フェーズ ルックアップ」として知られる新しいオーバーロード解決ルールのセットが使用されます。が実装されました。これらのルールは、constexpr 引数を使用して関数を呼び出すときに constexpr 関数を優先し、constexpr に基づいて関数のオーバーロードを効果的にシミュレートします。

constexpr ラムダを利用するか、C 20 以降の新しいオーバーロード解決ルールに従うことで、プログラマは次の機能を実現できます。

例:

  • std::string コンストラクター: C 11 では、std::string コンストラクターは区別されません。 constexpr 引数と非 constexpr 引数の間。ただし、C 17 の constexpr ラムダまたは C 20 の 2 フェーズ ルックアップ ルールを使用すると、constexpr 引数のみを取る constexpr コンストラクターを定義できます。
  • Optimized Functions with State: In C 11、constexpr の動作を維持しながら状態を利用できる効率的な関数を作成するのは困難です。ただし、C 20 では、2 フェーズ ルックアップ ルールにより、必要な場合にのみ呼び出される非 constexpr 関数の作成が許可され、可能な場合は constexpr セマンティクスが維持されます。

以上がC は Constexpr の引数に基づいて関数のオーバーロードにどのように対処しましたか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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