Прочитав это, я попытался выполнить такое преобразование с помощью static_cast
:
class A;
class B {
public:
B(){}
B(const A&) //conversion constructor
{
cout << "called B's conversion constructor" << endl;
}
};
class A {
public:
operator B() const //conversion operator
{
cout << "called A's conversion operator" << endl;
return B();
}
};
int main()
{
A a;
//Original code, This is ambiguous,
//because both operator and constructor have same cv qualification (use -pedantic flag)
B b = a;
//Why isn't this ambiguous, Why is conversion constructor called,
//if both constructor and operator have same c-v qualification
B c = static_cast<B>(a);
return 0;
}
Я ожидал, что он не будет компилироваться, потому что и конструктор, и оператор имеют одинаковую квалификацию c-v. Однако он успешно скомпилирован и static_cast
вызывает конструктор вместо оператора. Почему?
(скомпилировано с использованием gcc 4.8.1 с флагами pedantic
и Wall
)