może ktoś mi wyjaśnić różnicę pomiędzy następującymi zwyczajów Przestrzeń nazwCo wiodącą :: oznacza w "using namespace :: X" w C++
using namespace ::layer::module;
i
using namespace layer::module;
Co powoduje dodatkowe ::
przed layer
?
może ktoś mi wyjaśnić różnicę pomiędzy następującymi zwyczajów Przestrzeń nazwCo wiodącą :: oznacza w "using namespace :: X" w C++
using namespace ::layer::module;
i
using namespace layer::module;
Co powoduje dodatkowe ::
przed layer
?
nie byłoby różnicy, jeśli został użyty w kontekście takich jak:
namespace layer {
namespace module {
int x;
}
}
namespace nest {
namespace layer {
namespace module {
int x;
}
}
using namespace /*::*/layer::module;
}
z początkowym ::
pierwszy x
byłby widoczny po stosując dyrektywy, przy drugim x
wewnątrz nest::layer::module
byłoby widoczny.
+1 za fajną odpowiedź –
Drugi przypadek może być X::layer::module
, gdzie już się zdarzyło using namespace X
.
W pierwszym przypadku prefiks ::
oznacza "kompilator, nie bądź sprytny, zacznij od globalnej przestrzeni nazw ".
Wiodący ::
odnosi się do globalnej przestrzeni nazw. Każdy kwalifikowany identyfikator rozpoczynający się od ::
będzie zawsze odnosił się do jakiegoś identyfikatora w globalnej przestrzeni nazw. Różnica jest, gdy masz ten sam materiał w globalnym, jak również w niektórych lokalnych nazw:
namespace layer { namespace module {
void f();
} }
namespace blah {
namespace layer { namespace module {
void f();
} }
using namespace layer::module // note: no leading ::
// refers to local namespace layer
void g() {
f(); // calls blah::layer::module::f();
}
}
namespace blubb {
namespace layer { namespace module {
void f();
} }
using namespace ::layer::module // note: leading ::
// refers to global namespace layer
void g() {
f(); // calls ::layer::module::f();
}
}
Nazywa nazwa kwalifikowana jako odnośnika w C++.
Oznacza to, że obszar nazw warstw, do którego się odwołuje, to ten znajdujący się poza globalną przestrzenią nazw, a nie inna zagnieżdżona warstwa nazw.
Dla fanów Standerdese:
$ 3.4.3/1
„Nazwa członka klasy lub przestrzeni nazw można określić po :: zakres operatora rozdzielczości (5.1) nałożono na specyfikator-nazwy-zagnieżdżonej, który wyznacza swoją klasę lub przestrzeń nazw.Podczas wyszukiwania nazwy poprzedzającej operator :: scope scope, nazwy obiektów, funkcji i wyliczaczy są ignorowane, jeśli znaleziona nazwa nie jest nazwą klasy (klauzula 9) lub nazwa przestrzeni nazw (7.3.1), program jest źle sformułowany. "
To jest powtórka z http://stackoverflow.com/q/4925394/498253 – Tom
@Tom: Ale czy to rzeczywiście dokładny dupek? – sbi
@sbi: Tak, "co przed rozpoczęciem :: oznacza - i dlaczego jest używany?" ale ponieważ jest tu więcej odpowiedzi niż tam, nie mogę się zamknąć - po prostu pomyślałem, że link będzie pomocny – Tom