Неоднозначное пользовательское преобразование в visual c++ (vs2017)

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;
}

Ошибки:

  1. ошибка C2440: «инициализация»: невозможно преобразовать из «D» в «int»
  2. примечание: неоднозначное пользовательское преобразование

g ++ 7.3 (по умолчанию и с std = C++ 14.11.17) и VS2013 (обновление 5) компилирует это без каких-либо предупреждений / ошибок, связанных с функциями преобразования (даже с -Wall).

Почему код неоднозначен? Это ошибка VC++?

Вероятно, вам следует отправить отчет об ошибке.

user7860670 31.10.2018 12:21

Действительно похоже на ошибку.

Matthieu Brucher 31.10.2018 12:26

FWIW, icc 18 и 19 также не компилируются на Godbolt

NathanOliver 31.10.2018 13:33
0
3
88
1

Ответы 1

Это похоже на ошибку компилятора. Я сообщил об этом здесь: не может найти определяемое пользователем преобразование в виртуальном наследовании

Не стесняйтесь проголосовать за него, чтобы он получил приоритет для исправления

Другие вопросы по теме