在库中使用名称空间

时间:2013-08-08 08:02:50

标签: c++ namespaces name-lookup

我想知道库中是否需要完全符合条件的名称。

例如(为了便于阅读,我在这里缩进名称空间):

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,我是对的吗?

提前感谢您的回答。

1 个答案:

答案 0 :(得分:4)

你是对的,那里的资格似乎是不必要的。

不要尝试从标准库代码中学习C ++,它必须以非常特殊的方式编写,原因可能不适用于您,包括向后兼容性,可移植性,替代配置(例如,禁用所有命名空间)对于历史编译器)。在某些配置中_STD可能会扩展到不同的配置,或者它可能只是多余的(但无害的。)

  

带参数的模板函数中名称的名称查找规则是什么?我认为一个qualified-id会直接查找已经声明没有ADL的名字但是一个不合格的名字会做一个ADL,我是对的吗?

是的,ADL仅适用于不合格的名称。