У меня есть код вроде этого
struct B
{
B() {}
B(int v) {}
};
struct A
{
operator int() const { return 1; }
operator B() const { return B(); }
};
int main()
{
A a;
static_cast<B>(a); // Error here
a.operator B(); // This is OK
return 0;
}
Он создает такую ошибку компиляции:
main.cpp: In function ‘int main():
main.cpp:16:21: error: call of overloaded ‘B(A&) is ambiguous
static_cast<B>(a);
^
main.cpp:4:5: note: candidate: B::B(int)
B(int v) {}
^
main.cpp:1:8: note: candidate: constexpr B::B(const B&)
struct B
^
main.cpp:1:8: note: candidate: constexpr B::B(B&&)
Я не спрашиваю, как это исправить. Просто хотите понять, почему компилятор не принимает его? Из моего POV static_cast<B>(a)
совпадает с a.operator B()
но, похоже, компилятор читает его по-разному.
Обновить:
Такое поведение происходит до С++ 17. С С++ 17 этот код не создает никакой ошибки компиляции.