2010-11-24 2 views
23
struct A 
{ 
    A(const A& src); 
    A(const char* src); 
}; 
struct B 
{ 
    operator A(); 
    operator char*(); 
}; 
void test() 
{ 
    B v; 
    A s(v); 
} 

EDG/Комо и MSVC позволяют код, в то время как GCC 4.4.4, CLANG и BCC отклоняют его как неоднозначное.Должно ли это быть двусмысленным или нет? (неявные отливки)

член комитета

C++ ответил с этим (изначально):

Это не неоднозначным; конструктор A (const A &) лучше, чем конструктор A (const char *). Const & параметра непосредственно связывается с результатом функции преобразования, так что последовательность преобразования считаются быть определенным пользователем преобразованием с последующим посредством преобразования идентичности (13.3.3.1.4p1). Параметр const char * представляет собой пользовательское преобразование , за которым следует квалификация , поэтому это хуже.

Затем он продолжил это.

На самом деле, я был неправ. Хотя это правды, что вторая преобразование последовательность в определенном пользователе преобразование последовательности тай-брейк, выглядит более внимательно 13.3.3.2p3, то следующим за последнюю пулю, показывает, что это брейк применяется только если две последовательности содержат одну и ту же пользовательскую последовательность преобразования и , что в данном примере не так. Поскольку преобразование последовательности один конструктор использует B :: оператор А() и других видов использования б :: оператор (символ *), нет разрешения конфликтов между двумя определяемых пользователем последовательностей конверсии и они неоднозначны.

Мой вопрос в том, что.

13.3.3.2 p3 утверждает, что

Две неявные последовательности конверсии того же вида неразличимы последовательности преобразования, если один из следующих правил не применяются.

С моей точки зрения, ключевые слова являются «одним из следующих правил». Это не означает, что пуля, которая указывает «ту же последовательность преобразования» , отменяет все вышеперечисленные. Я бы подумал: «Ранг S1 лучше , чем ранг S2»?

+12

Прекрасное доказательство того, что C++ слишком мал, слишком сложным ... – Hexagon 2010-11-24 05:45:12

+0

Поскольку у вас есть контакт с членом сообщества C++, разве вы не должны просто просить его о проблеме? (или проверить, зарегистрировано ли оно по адресу http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html) – 2010-11-24 06:13:09

+0

Я не сказал, что есть проблема, я на самом деле пытаюсь понять стандарты. – 2010-11-24 06:25:12

ответ

4

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

Matching аргумент «V» типа «В» к параметрам любого из перегруженных конструкторов «А» требует определяемое пользователем преобразование. Там обе последовательности имеют ранг CONVERSION.

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

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

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

1

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

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

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

[...]

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

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


См Johannes комментарии понять, почему этот ответ неверен: это действительно неоднозначна по причине, указывал Chubsdad.

Смежные вопросы