Я сталкиваюсь с неожиданной проблемой в некотором коде, который я пишу сейчас, и я не уверен, какой компилятор прав.
У нас есть конструктор с несколькими аргументами, который принимает const char*, const char*
, но он объявлен явным:
constexpr explicit Wrapper(const char* a, const char* b) : pair(a,b){}
И тогда у нас есть функция, которая принимает Wrapper
и перегрузку, которая принимает std::pair<const char*, const char*>
void q(Wrapper w);
void q(std::pair<const char *, const char *> w);
И тогда у нас есть такой код, который я бы назвал второй перегрузкой:
q({"a", "b"});
Это компилируется на clang, но не компилируется как на GCC, так и на MSVC. Я пытался найти упоминание явного конструктора multi-arg в стандарте, и если что-то упоминает эту двусмысленность, но я не нашел соответствующий текст. Мне просто интересно, какое поведение правильное и что неправильно?
ссылка godbolt: https://godbolt.org/g/2aYUov