提供されたコードでは、関数 function は整数パラメーターを受け入れるように宣言されています。ただし、暗黙的なキャストにより、誤って文字、ブール値、long 型も受け入れてしまいます。この望ましくない動作を防ぐために、厳密な型一致を強制し、暗黙的な変換を禁止する方法を模索します。
暗黙的な変換を回避する 1 つのアプローチは、関数テンプレートを定義することです。目的のタイプを除くすべてのタイプに一致します。たとえば、他の型のテンプレートを作成し、それを削除済みとしてマークし、そのコンパイルを効果的に禁止できます。
void function(int); // this will be selected for int only template<class T> void function(T) = delete; // C++11
このようにして、直接一致する非テンプレート関数 (この場合は void 関数) (int)、整数の場合は常に選択されます。他の型で関数を呼び出そうとすると、削除されたテンプレートが原因でエラーが発生します。
C 11 より前では、別のメソッドが必要でした。暗黙的な変換を行わずに型厳密な関数呼び出しを実現します。これには、DeleteOverload クラスの作成と、それを使用して不要な型のオーバーロード選択を無効にすることが含まれます。
// because this ugly code will give you compilation error for all other types class DeleteOverload { private: DeleteOverload(void*); }; template<class T> void function(T a, DeleteOverload = 0); void function(int a) {}
C 23 では、よりユーザーフレンドリーなアサーションが導入されています。 static_assert(false, msg) を使用するアプローチ。これにより、型の不一致時のエラー メッセージがより明確になります。
void function(int) {} // this will be selected for int only template<class T> void function(T) { // since C++23 static_assert(false, "function shall be called for int only"); } int main() { function(1); // function(1l); // ^^^^^^^^^^^^ produces error: // error: static assertion failed: function shall be called for int only }
これらの手法を採用することで、非構築関数での暗黙的な変換を回避し、より厳密な型チェックを保証し、潜在的なエラーを排除できます。不注意による型の不一致が原因です。
以上が非構築 C 関数での暗黙的な型変換を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。