【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以上才支持

posted @ 2024-03-19 20:45  坚持梦想的蜗牛  阅读(39)  评论(0编辑  收藏  举报