В стандарта (напр. 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