預設轉換
考慮如下程式碼
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以上才支援