【问题标题】:Local function declaration inside namespace命名空间内的局部函数声明
【发布时间】:2012-12-18 04:07:48
【问题描述】:

在这种情况下

namespace n {
    void f() {
        void another_function();
    }
}

函数another_function应该定义在命名空间n内部还是外部? VS 2012(带有November CTP)说它应该在外面,而Mac上的GCC 4.7.2说它应该在里面。如果我做错了,我会从链接器中得到未定义的符号错误。

我通常相信 GCC 更符合标准,但这是 C++,你永远无法确定。

【问题讨论】:

  • 你为什么要这么做?
  • @BillyONeal 因为another_function 是一个实现细节,f 是一个模板。
  • 但是在f 中声明another_function 并不比f 更不可见。如果有人碰巧定义了自己的n::another_function,它只会导致多个定义错误。
  • @BillyONeal 没有客户会/不应该将东西放入我的命名空间,因为它是一个库。它确实使它稍微不那么明显,因为他们必须努力获得原型。有没有更好的方法?
  • 我只是将原型放在your_namespace::detail 中。无论如何,这就是 boost 在这些情况下所做的。约定是命名空间detail 内的任何内容都是实现细节。

标签: c++ namespaces function-declaration


【解决方案1】:

根据 N3485 7.3.1 [namespace.def]/6,正确答案是n::another_function

声明的封闭命名空间是那些命名空间 声明在词汇上出现,除了重新声明 其原始名称空间之外的名称空间成员(例如,定义 如 7.3.1.2 所述)。这样的重新声明具有相同的封闭 命名空间作为原始声明。 [ 例子:

namespace Q {
    namespace V {
        void f(); // enclosing namespaces are the global namespace, Q, and Q::V
        class C { void m(); };
    }
    void V::f() { // enclosing namespaces are the global namespace, Q, and Q::V
        extern void h(); // ... so this declares Q::V::h
    }
    void V::C::m() { // enclosing namespaces are the global namespace, Q, and Q::V
    }
}

——结束示例]

【讨论】:

    【解决方案2】:

    C++11 3.5(以及 C++03)

    7 未找到具有链接的实体的块范围声明时 要引用其他声明,则该实体是 最里面的封闭命名空间。然而这样的声明并不 在其命名空间范围内引入成员名称。

    您示例中的声明声明了n::another_function

    【讨论】:

    • +1 - 这个答案比我的更完整。离开我的,因为它仍然有那个有用的例子。
    猜你喜欢
    • 2017-05-31
    • 1970-01-01
    • 2013-05-19
    • 2013-08-16
    • 1970-01-01
    • 2014-12-30
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多