Я смотрел на стандарт C++ относительно базового элемента операторы (унарный *
Разыменование оператор, оператор аксессор ->
член), а также многие другие связанные вопросы:C++ доступ к члену/Косвенная оператор эквивалентности
C++ - Difference between (*). and ->?
ptr->hello(); /* VERSUS */ (*ptr).hello();
C++ pointers difference between * and ->
Я видел, что большинство ответов говорится, что p->m
является синтаксическим сахаром для (*p).m
, как это определено в стандарте C++ (5.2.5, пункт 2):
Выражение
E1->E2
преобразуется в эквивалентной форме(*(E1)).E2
Многие комментарии также отметил, что из-за operator*
и operator->
являются перегружаемыми в классах, они должны быть перегружены равномерно для обеспечения согласованного поведения.
Эти утверждения, кажется, противоречат друг другу: если (в соответствии со стандартом) E1->E2
преобразуется в эквивалентную форму (*(E1)).E2
, то, что было бы целью перегрузки operator->
(как это разрешено стандартом)?
Проще говоря, эти две части стандарта в конфликте, или я не понимаю стандарт?
Преобразование эквивалентности E1->E2
в (*(E1)).E2
распространяется на все полные типы или только на встроенные?
См. Пункт 3 раздела 5, «Пункт 5 определяет эффекты операторов при применении к типам, для которых они не были перегружены». –