【C++】禁止隐式转换
默认转换
考虑如下代码
void f(int a){}
以下调用都是合法的:
int main(void)
{
f(1); // 调用1
f(2.f); // 调用2
f('c'); // 调用3
f(1ul); // 调用4
return 0;
}
合法的原因是C++的隐式自动转换,甚至支持的类也可以自动转换,比如如下Test类,也可以作为f的参数
class Test {
public:
operator int() const
{
return 0;
}
};
禁用隐式转换
如果有时我们希望禁用隐式自动转换,有两种方式
方式一:
void f(int a){}
template<typename T> void f(T) = delete;
方式二:
void f(int a){}
void f(auto) = delete;
这样,只有调用1才可以正常编译通过,调用2、调用3、调用4都会编译出错,
以达到提前控制编码错误的目的。
不过,需要注意的是第二种方法需要c++14以上才支持