【发布时间】:2013-08-08 08:02:50
【问题描述】:
我想知道库中是否需要完全限定名称。
例如(为了便于阅读,我在此处缩进命名空间):
namespace A {
namespace B {
namespace C {
class Foo { ... };
} // namespace C
::A::B::C::Foo foo;
// or
C::Foo foo
} // namespace B
namespace D {
::A::B::C::Foo foo;
// or
B::C::Foo foo
} // namespace D
} // namespace A
我没有完全理解C++标准的3.4章,在STL向量头中看到了一些我无法解释的东西(为了可读性而简化了):
namespace std {
template<..
class reverse_iterator
{ ... };
template<..
class vector {
typedef _STD reverse_iterator<const_iterator> const_reverse_iterator;
...
}
}
问题是 _STD 被扩展为 ::std:: .. 但根据我对名称查找的理解,reverse_iterator 将首先在向量中查找,然后在父命名空间中查找,即 std。怎么可能发生碰撞?
附属问题:在带有参数的模板函数中,名称查找规则是什么?我认为合格的 id 会直接查找已在没有 ADL 的情况下声明的名称,但不合格的名称会执行 ADL,对吗?
提前感谢您的回答。
【问题讨论】:
-
我总是完全限定我的命名空间。它对编译器没有任何影响,但是当我多年后再次查看它时,它使理解和导航代码变得更加容易。
-
我有时也只是为了清楚起见,但我想知道更多关于全局范围限定 ::A::... 而不是 A:: 。我有大约 3 个级别的命名空间,这使得完全限定名称太长而无法从其清晰性中受益。
标签: c++ namespaces name-lookup