【C++】禁止隱式轉換

坚持梦想的蜗牛發表於2024-03-19

預設轉換

考慮如下程式碼

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

相關文章