C++ 中的类型是可以相互转换的,编译器会自动地转换运算对象的类型:
在大多数的表达式中,比int类型小的整形值首先提升为较大的整数类型在条件判断中,非布尔值转换成布尔类型初始化过程中,初始值转换为变量的类型;在赋值语句中,右侧运算对象转换成左侧运行对象的类型。如果算术运算或关系运算的运算对象有多种类型,需要转换为同一种类型函数调用结合explicit关键字可以很好地理解第3点。比如有string str = "123"; 这语句中就是隐式调用了string 类的单参数构造函数。
string的单参数构造函数定义如下。(basi_string 就是syring,在 stl_string_fwd.h 中有定义 typedef basic_string<char> string;)
basic_string(const basic_string& __s) : _Base(__s.get_allocator()) { _M_range_initialize(__s.begin(), __s.end()); }这个就是上面第3点的例子。
在添加了explicit之后会怎样?explicit的作用的抑制构造函数定义的隐式转换,vector中的单参数构造函数添加了explicit定义。所以 vector<int> v = 1 ; 这种语句会出现编译错误,我们只能够使用 vector<int> v(1);
explicit vector(size_type __n) : _Base(__n, allocator_type()) { _M_finish = uninitialized_fill_n(_M_start, __n, _Tp()); }此前怀疑是由于string可能存在无参数构造函数,但是看源码发现string没有无参的构造函数,进一步证实了explicit的作用。