C 11 での Constexpr 引数による関数のオーバーロード
C 11 では、constexpr 引数に基づいて関数をオーバーロードできないため、制限が生じます。同一のシグネチャで異なる constexpr ステータスを持つ関数を定義できないため、constexpr の可能性が制限されます。たとえば、constexpr 引数には constexpr std::string コンストラクターが必要で、constexpr 以外の引数には非 constexpr コンストラクターが必要な場合があります。
そのようなオーバーロード機能がないため、C 11 では実現可能かという疑問が生じます。 constexpr 引数に基づくオーバーロードをサポートする実装は、標準の更新を義務付けますか?
現在の C 11 実装では、constexpr 引数に基づくオーバーロードは許可されていません。この制限は意図的に実装されました。
代替案と考慮事項
constexpr のオーバーロードがないにもかかわらず、代替案が存在します。 1 つのオプションには、テンプレートの使用が含まれます。たとえば、constexpr std::string コンストラクターの機能を実現するには、次のようなテンプレートを作成できます。
template<int n> static inline double pow(double x) { // Fast implementation of x ^ n, with n a compile time constant return ... }
ただし、このアプローチでは、n がコンパイル済みかどうかに応じて、ユーザーが個別の関数呼び出しを使用する必要があります。時定数は、ライブラリ関数にとって不便で予測不可能な場合があります。
潜在的な利点
constexpr 引数に基づいて関数のオーバーロードを有効にすると、次のような利点があります。
以上がここでは、実現可能性と潜在的な利点の問題に焦点を当てた、いくつかのタイトルのオプションを示します。 オプション 1 (直接的かつ簡潔): * C 11 は Constexpr 引数に基づいたオーバーロードを実装できますか? オプション 2の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。