Почему в C ++ не существует ссылки на член?

В C ++ я могу выбирать между указателями функций и ссылками на функции (или даже значениями функции для полноты):

void call_function_pointer (void (*function)()) { (*function) (); } void call_function_reference (void (&function)()) { function (); } void call_function_value (void function()) { function (); } 

Однако, когда дело доходит до методов, у меня нет выбора между указателями и ссылками.

 template  void call_method_pointer (T* object, void (T::*method)()) { (object->*method) (); } // the following code creates a compile error template  void call_method_reference (T& object, void (T::&method)()) { object.method (); } 

Это приводит меня к предположению, что ссылки на методы не существуют в C ++. Это правда? Если это так, то почему они не существуют?

One Solution collect form web for “Почему в C ++ не существует ссылки на член?”

В стандарте (например, N3337 – не последнее, но прекрасно для этого) есть примечание в конце раздела 8.3.3.3, которое гласит:

[Примечание: см. Также 5.3 и 5.5. Тип «указатель на член» отличается от типа «указатель», то есть указатель на член объявляется только указателем на синтаксис объявления участника и никогда не является синтаксисом декларатора указателя. В C ++ нет типа «ссылки на член». – конечная нота]

Кроме того, конечно, нет операторов «ссылки на члены» (что, предположительно, лучшее, что я могу придумать, было бы чем-то вроде ->& и .& , Хотя они не согласуются с разыменованием ссылок на данные и функции , которые не требуют специального оператора).

Зачем?

Что касается причины; после небольшого исторического исследования и отсутствия каких-либо существующих заметок (я полностью вернулся к Cfront 2.0, где первый указатель был включен – отредактируйте: согласно гораздо более достоверному документу , эта функция была фактически впервые поддержанный в Cfront 1.2 ), я спросил самого человека и вот ответ:

 Дата: сб, 22 фев 2014 10:12:51 -0500
 От: Bjarne Stroustrup < ...>
 Тема: Re: Об отсутствии ссылки на члена и CFront 2.0

 22/24/2014 6:40, Джейсон С писал:
 > Мой вопрос: C ++ очень четко запрещает концепцию 
 > «ссылка на пользователя».  Почему это?  Я много делал 
 > исследование, и я проследил происхождение «указателя на член» назад (I 
 > подумайте) до 1989 CFront 2.0.  Я прочитал справочное руководство по продукту 
 > и другую документацию, надеясь найти какое-то объяснение, но 
 > не мог.

 Я действительно не помню.  Это было еще 25 лет назад, и ARM молчит 
 это.  Я добавил указателей на членов, чтобы устранить необходимость в редких 
 поломка системы типов.  Я подозреваю, что не добавил ссылок на 
 потому что это не стоило усилий: не было случая использования.

Честно говоря, я ожидал чего-то гораздо более загадочного и сложного.

Итак, у вас есть это: в следующий раз, когда кто-нибудь спросит, почему нет ссылки на человека, вы можете с уверенностью сказать: «Потому что нет!» (Примечание: см. Мои оценки в комментариях, еще предстоит провести некоторое историческое исследование, чтобы получить 100% -ную уверенность.)

Лично я ни разу не нашел использования для указателей на членов в своем собственном коде, но явное обоснование их существования дано в «Эволюции C ++» в Страуступах: 1985-1989 , стр. 222-223.


Кстати, ваш синтаксис для вызова гипотетической ссылки на функцию-член:

 object.method(); 

… не имеет большого смысла, поскольку нет возможности отличить это синтаксически от вызова фактическому члену с именем method() .

hvd поднимает хороший пункт ниже: Как вы можете видеть из вышеизложенного, синтаксически, не было бы действительно последовательного способа разыменования ссылки на члена. Вы должны отличить его от обычного доступа к члену, но в то же время вы хотите сделать его совместимым с разыменованием ссылок на объекты и функции (которые не требуют специального оператора), и я не могу думать о чем-либо, что и то и другое.

  • Почему этот код segfault на 64-битной архитектуре, но отлично работает на 32-битной?
  • Является ли sizeof (некоторый указатель) всегда равным четырем?
  • Автоматическое открытие InfoWindow при добавлении маркера Google Maps v2 Android
  • Оператор Dot (".") И стрелка ("->") используют в C против Objective-C
  • как отображать изображения, сохраненные в папке sdcard в android
  • Давайте будем гением компьютера.