Опасность может быть неожиданным результатом ... когда вы создаете D, вы ожидаете получить D в качестве результата.Существует также тот факт, что в нем задействован актерский состав ... это "безопасный" актерский состав, но, тем не менее, актерский состав.Для первого примера можно привести идентичный аргумент ... почему компилятор просто не создает d
и int
, поскольку double
можно преобразовать тривиально, и он уже решил, что это тип, основанный на результатедля i
.Или как в случае, когда у вас есть два родственных класса ... должны ли они разрешить общую базу?
Если вы хотите, чтобы этот код компилировался, вы всегда можете явно привести результат D()
так, чтобыоба выражения дают один и тот же тип.
А для юриста по языку бит:
[decl.spec.auto] / 7:
Если список деклараторов содержит более одного декларатора,тип каждой объявленной переменной определяется как описано выше.Если тип, выведенный для параметра шаблона U, не является одинаковым при каждом вычете, программа некорректна.