非構築関数での暗黙的な変換の回避
問題の定式化:
C では、非構築関数は、宣言された型と一致するようにパラメータを暗黙的にキャストできます。この動作は、場合によっては便利ですが、関数パラメーターを特定の型に制限しようとすると、予期しない結果やコンパイル エラーが発生する可能性があります。
解決策:
暗黙的を防ぐには変換を行い、非構築関数が特定の型のパラメータのみを受け入れるようにするには、次の手法を使用できます。雇用:
1.テンプレートの削除による関数のオーバーロード (C 11 以降):
必要な引数の型と一致する特定のテンプレートの型を使用して関数のオーバーロードを定義します。次に、他のすべての型に対して削除される別の関数テンプレートを宣言します。これにより、その関数の暗黙的な変換が効果的に無効になります:
void function(int); // Delete overload for all other types template<class T> void function(T) = delete;
2。クラスベースの関数オーバーロードの削除 (C 11 より前):
暗黙的な変換を防ぐための古いアプローチには、void ポインターを受け取るプライベート コンストラクターを持つクラスの作成が含まれていました。適切なテンプレート引数を使用してこのクラスをインスタンス化すると、一致しないオーバーロードがすべて削除されます:
class DeleteOverload { private: DeleteOverload(void*); }; template<class T> void function(T a, DeleteOverload = 0); void function(int a) {}
3。静的アサーション (C 23 以降):
C 23 では、関数が正しい型で呼び出されているかどうかを検証するために静的アサーションを使用する機能が導入されています。このアプローチでは、以前の方法と比較して、より明示的で有益なエラー メッセージが提供されます。
void function(int) {} template<class T> void function(T) { // Static assertion fails when called with non-matching types static_assert(false, "function shall be called for int only"); }
これらの手法のいずれかを利用することで、非構築関数が特定の型のパラメータを受け入れるように制限でき、暗黙的な変換が発生するのを防ぎます。
以上が非構築 C 関数での暗黙的な変換を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。