В C++ оператор ::
используется для доступа к классам, функциям и переменным в пространстве имен или классе.
Если бы спецификация языка использовала .
вместо ::
и в этих случаях, например, при доступе к переменным/методам экземпляра объекта, то это вызвало бы возможные двусмысленности, которых нет с ::
?
Учитывая, что C++ не допускает имен переменных, которые также являются именами типов, я не могу придумать случая, когда это могло бы произойти.
Уточнение: Я'не спрашиваю, почему ::
было выбрано вместо .
, просто если бы это тоже могло работать?
Из-за попыток сделать C++ в основном совместимым с существующим кодом C (который допускает коллизии имен между именами объектов и тегами struct), C++ допускает коллизии имен между именами классов и именами объектов.
Это означает, что:
struct data {
static int member;
};
struct data2 {
int member;
};
void f(data2& data) {
data.member = data::member;
}
это легальный код.
Пример, когда оба варианта действительны, но относятся к разным объектам:
#include <iostream>
struct A {
int i;
};
struct B {
int i;
A B;
};
int main() {
B x {0, 1};
std::cout << x.B.i << '\n';
std::cout << x.B::i << '\n';
}
Смотрите прямой эфир на coliru.
Существует разница между a::b
и a.b
, где ::
подразумевает, что a
используется как пространство имен, что означает, что это пространство имен или typename. При условии, что C++ поддерживает невиртуальное множественное наследование и что переменная может иметь тот же тип, что и тип, это лишает шансов сослаться на неправильный объект. Это необходимо для метапрограммирования шаблонов.
Другим примером может быть &B::foo
против &B.foo
в контексте класса B.
Расширим пример @Deduplicator:
#include <iostream>
структура А
Внутри меня;
};
структура В: общественная А
Внутри меня;
А;
};
int main() {
B x {1, 2};
std::cout << x.i << '\n';
std::cout << x.B::i << '\n'; // То же самое, что и в строке выше.
std::cout << x.A.i << '\n';
std::cout << x.A::i << '\n'; // Не то же самое, что строка выше.
}
Не имея возможности дифференцировать с помощью ::, к какому члену мы хотим получить доступ, невозможно получить доступ к членам, объявленным в родительском классе с одинаковыми именами.