Поиск имени работает из внутренней области видимости наружу, поэтому вам не нужно каждый раз идти сверху вниз.Если вы пропустите ведущий ::
, то вы получите поиск, который возвращается, пока он не найдет искомое имя, поэтому f::p
эффективно возвращается, пока не найдет f
, а затем не найдет p
внутри этого f
.Вам не нужен полный ::f::p()
, хотя в вашем случае, поскольку f
находится в глобальном пространстве имен, нет большой разницы в наборе.
Рассмотрим этот пример, где экономия для вызова ::f::g::f::p()
более очевиден.
namespace f {
void p();
namespace g {
void p();
namespace f {
void p();
namespace h {
void p()
{
f::p(); // same as ::f::g::f::p()
::f::p(); // fully qualified
g::p(); // same as ::f::g::p();
p(); // recurse!
}
}
}
}
}
Не существует явного способа принудительного поиска, чтобы исключить непосредственный уровень области действия (блок или пространство имен, нет ..::p()
или ^::p()
или что-то в этом роде.