我理解具有一个(非默认)参数的构造函数就像隐式转换器,它从该参数类型转换为类类型.但是,explicit可用于限定任何构造函数,没有参数的构造函数(默认构造函数)或具有2个或更多(非默认)参数的构造函数.
为什么明确允许这些构造函数?有什么例子可以防止某种隐式转换吗?
我在一些代码中遇到了一个意想不到的问题,我现在正在编写,我不确定哪个编译器是正确的.
我们有一个多参数构造函数const char*, const char*,但它被声明为显式:
constexpr explicit Wrapper(const char* a, const char* b) : pair(a,b){}
Run Code Online (Sandbox Code Playgroud)
然后我们有一个功能,需要Wrapper和一个过载,需要一个std::pair<const char*, const char*>
void q(Wrapper w);
void q(std::pair<const char *, const char *> w);
Run Code Online (Sandbox Code Playgroud)
然后我们有这样的代码,我希望将其称为第二个重载:
q({"a", "b"});
Run Code Online (Sandbox Code Playgroud)
这在clang上编译很好,但是无法在GCC和MSVC上编译.我一直试图在标准中寻找任何明确的多arg构造函数的提及,如果有什么提到这种歧义,但我没有找到相关的文本.我只是想知道哪种行为是正确的,哪种是错的?
godbolt链接:https://godbolt.org/g/2aYUov
任何人都可以解释为什么非单参数构造函数标记为显式编译?据我所知,这里绝对是无用的关键字,为什么这个编译没有错误?
class X
{
public:
explicit X(int a, int b) { /* ... */}
};
Run Code Online (Sandbox Code Playgroud) 我做了一些关于定义显式构造函数的研究(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)