W C ++ operator ::
służy do uzyskiwania dostępu do klas, funkcji i zmiennych w przestrzeni nazw lub klasie.
Jeśli specyfikacja języka zastosowana .
zamiast ::
w tych przypadkach jest zbyt podobna do uzyskiwania dostępu do zmiennych instancji / metod obiektu, to czy spowodowałoby to możliwe niejasności, których nie ma ::
?
Biorąc pod uwagę, że C ++ nie dopuszcza nazw zmiennych, które są również nazwami typów, nie mogę wymyślić przypadku, w którym mogłoby się to zdarzyć.
Wyjaśnienie: Nie pytam, dlaczego ::
wybrano .
, tylko czy to mogło zadziałać?
c++
language-design
Jimmy RT
źródło
źródło
Odpowiedzi:
Z powodu prób uczynienia C ++ w większości kompatybilnym z istniejącym kodem C (który pozwala na kolizje nazw między nazwami obiektów i znacznikami struktury), C ++ pozwala na kolizje nazw między nazwami klas a nazwami obiektów.
Co oznacza że:
jest legalnym kodem.
źródło
.
lub::
pomiędzy dwoma „słowa” posiada inny efekt (data.member
odnosi się domember
tegodata
obiektu klasydata2
, przy czymdata::member
odnosi się domember
klasydata
)?::
zostały zmienione na.
. W pewien sposób odpowiedziałeś już tak . Po prostu nie mogę wniknąć w twój pierwszy komentarz. Może mój poziom sprawia, że ten komentarz wydaje mi się zadymiony.Przykład, w którym oba są poprawne, ale odnoszą się do różnych obiektów:
Zobacz na żywo na coliru .
źródło
Istnieje różnica między
a::b
ia.b
gdzie::
implikuje to, że jesta
używana jako przestrzeń nazw, co oznacza, że jest to przestrzeń nazw lub nazwa typu. Pod warunkiem, że C ++ obsługuje nie-wirtualne dziedziczenie liczby mnogiej i że zmienna może mieć taką samą nazwę jak typ, eliminuje to ryzyko odniesienia do niewłaściwego obiektu. Jest to konieczne do metaprogramowania szablonu.Innym przykładem może być
&B::foo
vs&B.foo
w kontekście klasy B.źródło
Pozwól rozszerzyć przykład @Deduplicator:
Na żywo w Coliru Viewer
Nie mając możliwości rozróżnienia za pomocą ::, do którego członka chcemy uzyskać dostęp, nie można uzyskać dostępu do członków zadeklarowanych w klasie nadrzędnej o identycznych nazwach.
źródło
A A
(nazwa zmiennej, która jest również nazwą typu) nie jest jednak poprawna w C ++, więc ten przykład na razie nie działa