Почему C ++ не использует .
там, где он использует ::
, потому что так определен язык.Одной из возможных причин может быть обращение к глобальному пространству имен с использованием синтаксиса ::a
, как показано ниже:
int a = 10;
namespace M
{
int a = 20;
namespace N
{
int a = 30;
void f()
{
int x = a; //a refers to the name inside N, same as M::N::a
int y = M::a; //M::a refers to the name inside M
int z = ::a; //::a refers to the name in the global namespace
std::cout<< x <<","<< y <<","<< z <<std::endl; //30,20,10
}
}
}
Онлайн-демонстрация
Я не знаюкак Java решает это.Я даже не знаю, есть ли в Java глобальное пространство имен.В C # вы ссылаетесь на глобальное имя, используя синтаксис global::a
, что означает, что даже в C # есть оператор ::
.
, но я не могу вспомнить ни одной ситуации, в которой такой синтаксис, какв любом случае это было бы законно.
Кто сказал, что синтаксис, такой как a.b::c
, недопустим?
Рассмотрим эти классы:
struct A
{
void f() { std::cout << "A::f()" << std::endl; }
};
struct B : A
{
void f(int) { std::cout << "B::f(int)" << std::endl; }
};
Теперь посмотрим на это ( ideone ):
B b;
b.f(10); //ok
b.f(); //error - as the function is hidden
b.f()
не может быть вызвано так, поскольку функция скрыта, и GCC выдает это сообщение об ошибке:
error: no matching function for call to ‘B::f()’
Inчтобы позвонить b.f()
(точнее A::f()
), вам нужен оператор разрешения области действия:
b.A::f(); //ok - explicitly selecting the hidden function using scope resolution
Демо на ideone