使用命名空间 (std:: vs ::std::) 的区别
Difference in using namespace (std:: vs ::std::)
using ::std::...;
与
using std::...;
有区别吗?如果是,是哪一个?
我看到了这个:
using ::std::nullptr_t;
这让我很纳闷。
在您的情况下,很可能没有区别。但是,通常,区别如下:
using A::foo;
从当前范围解析A
,而using ::A::foo
从根命名空间搜索A
。例如:
namespace A
{
namespace B
{
class C;
}
}
namespace B
{
class C;
}
namespace A
{
using B::C; // resolves to A::B::C
using ::B::C; // resolves to B::C
// (note that one of those using declarations has to be
// commented for making this valid code!)
}
如果您位于另一个具有自己的嵌套std
命名空间的命名空间中,则::std
和std
是不同的。一个简单的例子:
#include <iostream>
namespace A {
namespace std {
void foo() { ::std::cout << "foo" << ::std::endl;}
}
//using std::cout; // compile error
using ::std::cout; //ok
using std::foo; // ok
//using ::std::foo; // compile error
}
尽管拥有嵌套的std
命名空间绝对不是一个好习惯。
发件人: http://en.cppreference.com/w/cpp/language/using_declaration
using-声明将另一个命名空间的成员引入到 当前命名空间或块范围
因此,如果当前作用域已经具有同名的类,则引入的类与当前命名空间/块中的类之间存在歧义。
using声明只是 using 指令的子集。using 指令定义如下 (http://en.cppreference.com/w/cpp/language/namespace(:
从非限定名称查找的角度来看,在 using-指令,直到它出现的范围的末尾, 命名空间名称中的每个名称都是可见的,就好像它是在 最近的封闭命名空间,其中包含 使用指令和命名空间名称。
因此,您可以考虑这两个显示可能出现的问题的示例。
它可以防止共享相同名称的命名空间之间的歧义(示例 1(以及不同命名空间中的类名之间的歧义(示例 2(。
namespace A
{
namespace B
{
struct my_struct {};
}
}
namespace B
{
struct my_struct {};
}
using namespace A; // removing this line makes B:: resolve to the global B::
int main()
{
::B::my_struct; // from global, will not pick A::B::
B::my_struct; // error: 'B' is ambiguous, there is A::B:: and B::
}
考虑这个例子,它展示了为什么人们避免使用using namespace std;
using namespace std;
template <typename T>
class vector
{ };
int main()
{
vector<int> v; // which one did you want? ambiguous
::vector<int> v_global; // global one
::std::vector<int> v_std; // std::vector<T>
}
这取决于您使用using
声明的位置。在全局命名空间作用域上,不会有任何区别。但是,如果您有类似
#include <iostream>
#include <vector>
namespace my_namespace {
namespace std {
class vector {
};
}
using std::vector;
}
int main()
{
my_namespace::vector<int> v;
}
除非您通知编译器通过声明using ::std::vector
来搜索声明中的全局命名空间 -> std 命名空间 -> 向量,否则它不会编译。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- std::enable_if 和 std::enable_if_t 有什么区别?
- "owned pointer"和 std::shared_ptr 的"stored pointer"有什么区别?
- std::ranges::begin 和 std::begin 有什么区别?
- std::stable_partition() 和 std::p artition() 有什么区别?
- std::fabs(a * b) 和 std::fabs(a) * std::fabs(b) 之间的区别
- 普通的右值引用和 std::forward 返回的引用有什么区别?
- std::tie 和 std::forward_as_tuple 有什么区别
- printf() 和 std::cout 在指针方面的区别
- malloc 和 calloc 与 std::string 之间的区别
- std::random_device和std::mt19937_64之间有什么区别
- 使用 std::move 将参数传递给函数,如果该参数声明为按值传递或使用移动操作数 &&,是否有区别?
- 打印一个带有静态 int 的函数,有一个 std::cout 和多个 std::cout 有什么区别?
- std::bit_cast 和 std::start_lifetime_as 之间有什么有用的区别吗?
- Python的bisect.bisect_left和C++的std::upper_bound的区别
- 互锁变量访问(在布尔值上)和 std::atomic_flag 之间的区别
- std::string [] 运算符和 at() 之间的区别
- 当应该使用它们时,std::stof 和 atof 有什么区别?