I know in C++, we use ::
to qualify the namespace for a variable or function, like myNamespace::a
. But I notice some usages like ::myFunction()
. Does it mean the function belongs to the global namespace?
Asked
Active
Viewed 100 times
1

Deduplicator
- 44,692
- 7
- 66
- 118

hackjutsu
- 8,336
- 13
- 47
- 87
-
This just ensures that resolution occurs in the global namespace instead of the namespace you are in. See http://stackoverflow.com/questions/4269034/what-is-the-meaning-of-prepended-double-colon – larrylampco Jul 27 '16 at 18:26
2 Answers
3
If the code compiles, then yes, ::myFunction()
is referencing the global declaration of myFunction
.
This is most commonly used when a local definition shadows your global definition:
namespace local {
int myFunction() {}; // local namespace definition
};
int myFunction() {}; // global definition.
using namespace local;
int main() {
// myFunction(); // ambiguous two definitions of myFunction in current scope.
local::myFunction(); // uses local::myFunction();
::myFunction(); // uses global myfunction();

Fantastic Mr Fox
- 32,495
- 27
- 95
- 175
3
Yes, it means the variable, type or function following it must be available in the global namespace.
It can be used for example when something is shadowed by a local definition:
struct S {
int i;
};
void f() {
struct S {
double d;
};
S a;
::S b;
static_assert(sizeof(a) != sizeof(b), "should be different types");
}

Dutow
- 5,638
- 1
- 30
- 40
-
1Take a look at [`type_traits`](http://en.cppreference.com/w/cpp/header/type_traits) and [`decltype`](http://en.cppreference.com/w/cpp/language/decltype) to get around types that have the same size. eg: `static_assert(std::is_same
::value, "should be different types");` – user4581301 Jul 27 '16 at 19:05