Рассмотрим следующий фрагмент кода:
class A;
class B {
public:
B(){}
B(A&) // conversion constructor that takes cv-unqualified A
{
cout << "called B's conversion constructor" << endl;
}
};
class A {
public:
operator B() const // conversion operator that takes cv-qualified A
{
cout << "called A's conversion operator" << endl;
return B();
}
};
int main()
{
B b = A(); // who gets called here?
return 0;
}
Согласно этому вопросу, выигрывает последовательность преобразования с наименьшей формой, соответствующей cv (13.3.3.2/3
в спецификации):
Стандартная последовательность преобразования S1 является лучшей последовательностью преобразования, чем стандартная последовательность преобразования S2, если [...] S1 и S2 являются привязками ссылок (8.5.3) и типы, на которые ссылаются ссылки, одинаковы. тип, за исключением cv-квалификаторов верхнего уровня, и тип, на который ссылается ссылка, инициализированная S2, является более cv-квалифицированным, чем тип, на который ссылается ссылка. инициализируется S1, ссылается.
Тем не менее, в приведенном выше фрагменте всегда выбирается оператор преобразования, независимо от того, является ли A cv-квалифицированным или нет в обеих функциях. Единственным исключением является то, что когда и конструктор, и оператор имеют квалификацию cv, компилятор жалуется на двусмысленность в выборе последовательности преобразования, в то время как в случае cv-unqualified нет (почему?).
Итак, вопрос:
- Почему в этом случае всегда выбирается оператор преобразования?
- Почему оба cv-qualified вызывают двусмысленность, а оба cv-unqualified нет?