我想知道库中是否需要完全符合条件的名称。
例如(为了便于阅读,我在这里缩进名称空间):
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。怎么可能碰撞?
辅助问题:带参数的模板函数中名称的名称查找规则是什么?我认为一个qualified-id会直接查找已经声明没有ADL的名字但是一个不合格的名字会做一个ADL,我是对的吗?
提前感谢您的回答。
答案 0 :(得分:4)
你是对的,那里的资格似乎是不必要的。
不要尝试从标准库代码中学习C ++,它必须以非常特殊的方式编写,原因可能不适用于您,包括向后兼容性,可移植性,替代配置(例如,禁用所有命名空间)对于历史编译器)。在某些配置中_STD
可能会扩展到不同的配置,或者它可能只是多余的(但无害的。)
带参数的模板函数中名称的名称查找规则是什么?我认为一个qualified-id会直接查找已经声明没有ADL的名字但是一个不合格的名字会做一个ADL,我是对的吗?
是的,ADL仅适用于不合格的名称。