struct A
{
A(const A& src);
A(const char* src);
};
struct B
{
operator A();
operator char*();
};
void test()
{
B v;
A s(v);
}
EDG / Comeau и MSVC позволяют код, в то время как GCC 4.4.4, CLANG и BCC
отвергни это как неоднозначное.
Член комитета C ++ ответил так (изначально):
Это не двусмысленно; A (const A &)
Конструктор лучше, чем A (const
char *) конструктор. Const A &
параметр привязывается напрямую к результату
функции преобразования, поэтому
последовательность преобразования считается
быть пользовательским преобразованием с последующим
путем преобразования личности
(13.3.3.1.4p1). Const char *
параметр является определяемым пользователем преобразованием
с последующей квалификацией
конверсия, так что хуже.
Затем он продолжил с этим.
На самом деле, я был неправ. Пока это
правда, что второе преобразование
последовательность в пользовательском преобразовании
Последовательность является таймбрейкером, выглядит более
близко в 13.3.3.2p3,
предпоследняя пуля показывает, что это
тай-брейк применяется только если два
последовательности содержат одинаковые
определяемая пользователем последовательность преобразования, и
в данном примере это не так.
Потому что преобразование одного конструктора
последовательность использует B :: оператор A () и
другое использование b :: operator char * (),
нет никакого разрыва между двумя
определяемые пользователем последовательности преобразования и
они неоднозначны.
У меня такой вопрос.
13.3.3.2 р3 утверждает, что
Две неявные последовательности преобразования
одинаковые формы неразличимы
последовательности преобразования, если один из
применяются следующие правила.
Насколько я понимаю, ключевыми словами являются "одно из следующих правил".
Это не значит, что пуля, которая гласит «та же самая последовательность преобразования»
отменяет все вышеперечисленное. Я бы подумал "ранг S1 лучше
чем ранг S2 "будет применяться вместо?