1

我想知道是否需要在库中完全限定名称。

例如(为了便于阅读,我在此处缩进命名空间):

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

预先感谢您的回答。

4

1 回答 1

4

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

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

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

是的,ADL 仅适用于非限定名称。

于 2013-08-08T08:15:57.367 回答