避免非构造函数的隐式转换
考虑一个需要整数参数但允许从其他类型隐式转换的非构造函数例如字符、布尔值和长整型。为了防止这种意外行为并确保函数只接受指定类型的参数,我们可以采用以下技术:
C 11 及更高版本方法:
最直接的方法是定义一个匹配所有其他类型的函数模板:
void function(int); // this will be selected for int only template <class T> void function(T) = delete; // C++11
这是有效的,因为直接匹配的非模板函数需要
C 11 之前的技术:
在 C 11 之前,另一种解决方案涉及创建一个辅助类来强制执行所需的行为:
// 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 更新:
C 23 引入了一种更简洁且信息丰富的方法来处理这种情况:
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"); }
在内部使用 static_assert当使用意外的参数类型调用函数时,函数模板会提供清晰的错误消息。
以上是如何防止 C 中非构造函数中的隐式转换?的详细内容。更多信息请关注PHP中文网其他相关文章!