我见过生产代码,例如
::std::vector<myclass> myvec;
我不知道前置::
的含义是什么 - 为什么要使用?
有关示例,请参阅:
答案 0 :(得分:19)
这完全限定了名称,因此只使用全局命名空间中vector
命名空间中的std
模板。它基本上意味着:
{global namespace}::std::vector<myclass> myvec;
如果在不同的命名空间中具有相同名称的实体,则会有所不同。有关何时重要的简单示例,请考虑:
#include <vector>
namespace ns
{
namespace std
{
template <typename T> class vector { };
}
void f()
{
std::vector<int> v1; // refers to our vector defined above
::std::vector<int> v2; // refers to the vector in the Standard Library
}
};
由于不允许在std
命名空间中定义自己的实体,因此可以保证::std::vector
始终引用标准库容器。 std::vector
可能会引用别的东西。 。
答案 1 :(得分:5)
前导“::”指的是全局命名空间。假设您说namespace foo { ...
。然后std::Bar
引用foo::std::Bar
,而::std::Bar
引用std::Bar
,这可能是用户的意思。因此,如果您不确定当前所在的命名空间,那么始终包含初始“::”可以保护您不会引用错误的命名空间。
答案 2 :(得分:3)
此始终从标准库中获取vector
。如果我使用它的代码位于命名空间std::vector
中,mycompany::std::vector
也可能是mycompany
。
答案 3 :(得分:3)
举个例子 -
int variable = 20 ;
void foo( int variable )
{
++variable; // accessing function scope variable
::variable = 40; // accessing global scope variable
}
答案 4 :(得分:1)
以::开头意味着将命名空间重置为全局命名空间。如果你试图在你的代码中解决一些含糊之处,那么它可能会很有用。