我在一些代码中遇到了一个意想不到的问题,我现在正在编写,我不确定哪个编译器是正确的.
我们有一个多参数构造函数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