Почему базовый класс не выводится автоматически в том же объявлении «auto»? - PullRequest
3 голосов
/ 02 июля 2011

Ниже ошибка, связанная с auto, понятна:

auto i = int(), d = double(); // error: inconsistent deduction for ‘auto’

Однако, почему следующее преследуется с такой же ошибкой:

struct B {};
struct D : B {};

const auto &b1 = B(), &b2 = D(); // error: inconsistent deduction for ‘auto’

Зная, что b1уже выводится на const B&, не может ли компилятор сделать b2 также const B&?(т.е. какую опасность это может вызвать, если бы b2 было бы выведено до const B&?)

Ответы [ 2 ]

6 голосов
/ 02 июля 2011

Опасность может быть неожиданным результатом ... когда вы создаете D, вы ожидаете получить D в качестве результата.Существует также тот факт, что в нем задействован актерский состав ... это "безопасный" актерский состав, но, тем не менее, актерский состав.Для первого примера можно привести идентичный аргумент ... почему компилятор просто не создает d и int, поскольку double можно преобразовать тривиально, и он уже решил, что это тип, основанный на результатедля i.Или как в случае, когда у вас есть два родственных класса ... должны ли они разрешить общую базу?

Если вы хотите, чтобы этот код компилировался, вы всегда можете явно привести результат D() так, чтобыоба выражения дают один и тот же тип.

А для юриста по языку бит:

[decl.spec.auto] / 7:

Если список деклараторов содержит более одного декларатора,тип каждой объявленной переменной определяется как описано выше.Если тип, выведенный для параметра шаблона U, не является одинаковым при каждом вычете, программа некорректна.

0 голосов
/ 02 июля 2011

Нет. У компилятора такой свободы нет. Все auto переменные, которые попадают в одно и то же объявление, должны быть одного типа.

Ответь на это. Почему компилятор не может вызвать float версию этого:

void f(int);
void f(float);

f(10.5);

Потому что у компилятора нет такой свободы, чтобы автоматически выводить правильную функцию, когда возникает двусмысленность.

...