В стандарте (например, N3337 - не последний, но подходит для этого) в конце раздела 8.3.3.3 есть примечание, которое гласит:
[Примечание: см. также 5.3 и 5.5. Тип «указатель на член» отличается от типа «указатель», то есть указатель на член объявляется только с помощью синтаксиса декларатора указателя на член, а не синтаксиса декларатора указателя. В C++ нет типа «ссылка на член». — примечание в конце]
Кроме того, конечно, нет операторов типа "ссылка на член" (гипотетически лучшее, что я могу придумать, это что-то вроде ->&
и .&
, хотя они не согласуются с разыменованием ссылок на данные и функции, которые требуют без специального оператора).
Почему?
Что касается того, почему; после небольшого забавного исторического расследования и не найдя никаких существующих заметок по нему (я вернулся к Cfront 2.0, где указатель -to-member впервые был поддержан -- редактировать: в соответствии с a гораздо более достоверный документ, на самом деле эта функция впервые была поддержана в Cfront 1.2), я спросил самого человека, и вот ответ:
Date: Sat, 22 Feb 2014 10:12:51 -0500
From: Bjarne Stroustrup <...>
Subject: Re: On lack of reference-to-member and CFront 2.0
On 2/22/2014 6:40 AM, Jason C wrote:
> My question is: C++ very clearly disallows the concept of
> "reference-to-member". Why is this? I have been doing a lot of
> research, and I traced the origin of "pointer-to-member" back (I
> think) to 1989 CFront 2.0. I read through the product reference manual
> and other documentation hoping to find an explanation of some sort but
> could not.
I don't really remember. It was 25+ years ago and the ARM is silent on
this. I added pointers to members to eliminate the need for a rare
breakage of the type system. I suspect that I didn't add references to
members because it did not seem worth the effort: there was no use case.
Честно говоря, я ожидал чего-то гораздо более загадочного и сложного.
Итак, вот оно: в следующий раз, когда кто-нибудь спросит, почему нет ссылки на член, вы можете с уверенностью сказать: «Потому что ее нет!» (Примечание: смотрите мои бредни в комментариях; нужно еще провести некоторые исторические исследования, чтобы получить 100% достоверность.)
Лично я ни разу не нашел применения указателям на члены в своем собственном коде, но четкое обоснование их существования дано в Эволюция C++: 1985-1989, стр. 222-223.
Кстати, ваш синтаксис для вызова гипотетической функции ссылки на член:
object.method();
... не имеет особого смысла, так как синтаксически невозможно отличить это от вызова фактического члена с именем method()
.
hvd поднимает хороший вопрос ниже: как вы можете видеть из вышеизложенного, с точки зрения синтаксиса не было бы действительно последовательного способа разыменования ссылки на член. Вы должны отличать его от обычного доступа к членам, но в то же время вы хотите сделать его совместимым с разыменованием ссылок на объекты и функции (которые не требуют специального оператора), и я не могу придумать ничего, что выполняло бы и то, и другое.
person
Jason C
schedule
22.02.2014
.*
и->*
. Вопрос здесь в том, почему нет эквивалентов ссылки на член, хотя ссылки на объекты и ссылки на функции существуют. Даже на c.l.c++ существует множество дискуссий, которые заходят в тупик, как только кто-то спрашивает, почему. Мне лично очень любопытно обоснование, я уверен, что оно где-то похоронено в некоторых черновиках комментариев. - person Jason C   schedule 22.02.2014this
методу, чтобы вы могли использовать его напрямую. Это, вероятно, не тот способ, которым вы хотите создать абстракцию/согласованный интерфейс для нескольких классов (я думаю, это то, что вы пытаетесь). Используйте наследование. - person Etherealone   schedule 22.02.2014void call_function_value (void function()) {...
на самом деле означает:void call_function_value (void (*function)()) {...
Другими словами, фактический тип call_function_value равенvoid (void(*)())
- person R.G.   schedule 21.02.2018