【问题标题】:usage of namespaces in libraries库中命名空间的使用
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多