小编Mor*_*242的帖子

c ++显式多arg构造函数歧义

我在一些代码中遇到了一个意想不到的问题,我现在正在编写,我不确定哪个编译器是正确的.

我们有一个多参数构造函数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

c++ c++11

15
推荐指数
1
解决办法
432
查看次数

标签 统计

c++ ×1

c++11 ×1