Однако это неправильно.Может кто-нибудь объяснить, почему p [0] разрешается в Base &, а не Base?Это потому, что p [0] .foo () эквивалентно (p + 0) -> foo ()?
Вы поняли - это «операция косвенного массива».
Следующие выражения эквивалентны:
a[1];
*(a + 1)
Это стандарт: буквально «операция перенаправления массива» означает, что *(a + n)
заменяет a[n]
, поэтому результат является ссылкой наобъект, а не значение объекта, сгенерированное копией.
Это было важно для того, чтобы заставить полиморфизм работать, а также чтобы гарантировать, что производные типы не были "сгенерированы копированием" для базовых типов.далее, следующие также эквивалентны и приводят к ссылке на объект:
a[1][2][3];
*(*(*(a + 1) + 2) + 3);
[EDIT] Чтобы быть явным, в вашем примере, да, они точно эквивалентны:
p[0].foo();
(p+0)->foo(); // The "->" is the "*" indirection
(*(p+0)).foo();