为什么我们不能在函数上使用显式关键字?我想不出一个很好的理由不允许这样做(还有几个相反)。
为什么是这样?
您想要实现的目标(禁止函数参数的类型转换)可以通过声明函数的已删除模板版本轻松实现:
template <class T> void f(T) = delete;
void f(int){}
int main()
{
double k = 4;
f(k); //error: use of deleted function ‘void f(T) [with T = double]’
}
explicit
用于指示函数不能用于执行隐式类型转换。由于类型转换只能使用构造函数和转换运算符(如operator int()
)来完成,因此explicit
只有在应用于这些时才有意义。
历史注释:2011年之前,不能应用于转换算子;这被广泛认为是一个缺点,现在已得到修复。