Должно ли это быть неоднозначным или нет?(неявное приведение) - PullRequest
23 голосов
/ 24 ноября 2010
 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 "будет применяться вместо?

Ответы [ 2 ]

4 голосов
/ 24 ноября 2010

Да, ожидаемый результат - это неоднозначность в меру моей интерпретации п. 13.3.3.2

Сопоставление аргумента 'v' типа 'B' с параметрами любого из перегруженных конструкторов 'A'требует определенного пользователем преобразования.Там обе последовательности имеют рейтинг конверсии.

Моя интерпретация заключается в том, что применяется следующая цитата из $ 13.3.3.2

[...] Заданная пользователем последовательность преобразования U1 является лучшей последовательностью преобразования, чем другая пользовательская последовательность преобразованияU2 , если они содержат одну и ту же пользовательскую функцию преобразования или конструктор и , если вторая стандартная последовательность преобразования U1 лучше, чем вторая стандартная последовательность преобразования U2.

Обе они вызывают разные функции преобразования в классе 'B'.Поэтому я думаю, что первое условие само по себе не выполняется, и, следовательно, ожидаемый результат - неоднозначность, поскольку ни одна из последовательностей преобразования не лучше, чем другая.

1 голос
/ 24 ноября 2010

Отказ от ответственности: стандарт действительно сложен для этих частей, поэтому я могу быть совершенно неправ в моем понимании.

Стандартное определение жизнеспособной функции best (13.3.3):

Учитывая эти определения, жизнеспособный функция F1 определена как лучшая функция, чем другая жизнеспособная функция F2 если для всех аргументов i, ICSi (F1) не хуже, чем последовательность преобразования ICSi (F2), а затем

[...]

  • контекст инициализация путем пользовательского преобразования (см. 8.5, 13.3.1.5 и 13.3.1.6) и стандартную последовательность преобразования из тип возврата F1 к месту назначения тип (то есть тип объекта инициализируется) лучше последовательность преобразования, чем стандарт последовательность преобразования из возврата тип F2 для типа назначения.

Если я правильно понимаю, тип конструируемого объекта имеет здесь значение, и это сделает A::A(const A &) лучшим кандидатом.


Обратитесь к комментариям Йоханнеса, чтобы понять, почему этот ответ неверен: это действительно неоднозначно по причине, указанной Чубсдадом.

...