VS2017 (15.8.7 / 15.8.8) не может скомпилировать код следующим образом:
#include <iostream>
class A
{
public:
operator int() const { std::cout << "int() 1" << std::endl; return 0; }
operator int() { std::cout << "int() 2" << std::endl; return 0; }
};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};
int main()
{
// Compiles when const version is defined before non-const.
// The assignment calls const version of course.
const D cobj;
int i = cobj;
// Compiles when non-const version is defined before const.
// The assignment calls non-const version.
D obj;
int j = obj;
return 0;
}
Ошибка:
- ошибка C2440: «инициализация»: невозможно преобразовать из «D» в «int»
- примечание: неоднозначное пользовательское преобразование
g ++ 7.3 (по умолчанию и с std = c ++ 11/14/17) и VS2013 (обновление 5)
компилирует это без каких-либо предупреждений / ошибок, связанных с функциями преобразования
(даже с -Wall).
Почему код неоднозначен? Это ошибка VC ++?