компилятор не выполняет последовательное преобразование, определенное пользователем
Ваш учитель прав. В вашем примере кода это означает, что Myclass
не может быть преобразовано в Myclass1
при назначении в:
Myclass2 m2 = Myclass{};
Поскольку конструктор ожидает Myclass1
при создании Myclass2
, а компилятор не может последовательно преобразовать Myclass
в Myclass1
и затем использовать его для создания Myclass2
. Но если у вас есть следующая строка:
Myclass1 m2 = Myclass{};
Это будет работать, потому что конструктор Myclass1
принимает Myclass
в качестве аргумента.
Обновление:
Вы можете спросить, почему это работает:
Myclass2 m2 {Myclass{}};
Поскольку в этом случае вызывается конструктор, и преобразование может выполняться неявным образом, если вы не объявите Myclass1
как explicit
, что приведет к ошибке компиляции кода (спасибо Fureeish за напоминание), но в:
Myclass2 m2 = Myclass{};
похоже на вызов конструктора копирования, который нуждается в ссылке. так что если вы напишите так, это сработает:
Myclass2 m2 = Myclass1(Myclass{});
Как упоминалось EVG , VS 10 принимается Myclass2 m2 = Myclass{};
, если режим соответствия (/ permissive-) не активирован.