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»?
Прекрасное доказательство того, что C++ слишком мал, слишком сложным ... – Hexagon 2010-11-24 05:45:12
Поскольку у вас есть контакт с членом сообщества C++, разве вы не должны просто просить его о проблеме? (или проверить, зарегистрировано ли оно по адресу http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html) – 2010-11-24 06:13:09
Я не сказал, что есть проблема, я на самом деле пытаюсь понять стандарты. – 2010-11-24 06:25:12