В C ++ оператор ::
используется для доступа к классам, функциям и переменным в пространстве имен или классе.
Если бы спецификация языка использовалась .
вместо того, чтобы ::
в тех случаях, например, при доступе к переменным / методам экземпляра объекта, вызывать ли это возможные неоднозначности, которых нет ::
?
Учитывая, что C ++ не допускает имен переменных, которые также являются именами типов, я не могу вспомнить случай, когда это могло произойти.
Пояснение: я не спрашиваю, почему ::
был выбран .
, просто если бы это тоже сработало?
c++
language-design
Джимми Р.Т.
источник
источник
Ответы:
Из-за попыток сделать C ++ главным образом совместимым с существующим кодом C (который допускает конфликты имен между именами объектов и тегами структуры), C ++ допускает конфликты имен между именами классов и именами объектов.
Который означает, что:
это законный код
источник
.
или::
между теми же двумя «словами» имеет различный эффект (data.member
относится кmember
изdata
объекта классаdata2
, в то время какdata::member
относится кmember
классуdata
)?::
было изменено , возникла бы двусмысленность.
. Таким образом, вы уже ответили да . Я просто не могу проникнуть в вас первым комментарием. Возможно, мой уровень заставляет этот комментарий выглядеть дымным для меня.Пример, где оба действительны, но ссылаются на разные объекты:
Смотрите вживую на колиру .
источник
Существует разница между
a::b
иa.b
где::
подразумевается, чтоa
используется как пространство имен, что означает, что это пространство имен или имя типа. При условии, что C ++ поддерживает не виртуальное множественное наследование и что переменная может иметь то же имя, что и тип, это лишает возможности ссылки на неправильный объект. Это необходимо для шаблонного метапрограммирования.Другим примером будет
&B::foo
против&B.foo
в контексте класса B.источник
Давайте расширим пример @Deduplicator:
Жить на Coliru Viewer
Не имея возможности различить с помощью ::, к какому члену мы хотим получить доступ, невозможно получить доступ к членам, объявленным в родительском классе с одинаковыми именами.
источник
A A
(имя переменной, также являющееся именем типа) недопустимо в C ++, поэтому этот пример пока не работает