我最近遇到了一些奇怪的类,它有三个构造函数:
class Class
{
public:
explicit Class(int );
Class(AnotherClass );
explicit Class(YetAnotherClass, AnotherClass );
// ...
}
Run Code Online (Sandbox Code Playgroud)
这对我来说没有意义 - 我认为显式关键字是为了保护编译器选择的构造免受外来类型的影响.
这是允许的吗?如果它,它是什么意思?
我理解具有一个(非默认)参数的构造函数就像隐式转换器,它从该参数类型转换为类类型.但是,explicit可用于限定任何构造函数,没有参数的构造函数(默认构造函数)或具有2个或更多(非默认)参数的构造函数.
为什么明确允许这些构造函数?有什么例子可以防止某种隐式转换吗?
我做了一些关于定义显式构造函数的研究(link1,link2,link3,link4,link5).
但对我来说,为什么std :: list和std :: iterator单个参数构造函数定义为显式并且在实际情况下这个定义可能有用的原因仍然不明显.能否请一些例子来说明这个定义有助于避免错误.谢谢
explicit list(const _Alloc& _Al)
: _Mybase(_Al)
{ // construct empty list, allocator
}
explicit back_insert_iterator(_Container& _Cont)
: container(_STD addressof(_Cont))
{ // construct with container
}
Run Code Online (Sandbox Code Playgroud)