具有未命名命名空间的嵌套命名空间定义

时间:2018-06-08 04:25:58

标签: c++ namespaces language-lawyer standards unnamed-namespace

最近,在使用C ++ 17中添加的嵌套命名空间定义功能时,我遇到了一个让我思考的场景。使用正常的嵌套命名空间定义,可以嵌套一系列命名的命名空间定义,如下所示:

// Before

namespace A {
  namespace B {
    namespace C {
    }
  }
}

// After

namespace A::B::C {
}

这样可以方便地将许多命名的命名空间定义展平为单个定义,就像设计一样。但是对于某些情况,即使用未命名的命名空间,此模式会出现故障,例如以下示例:

// Before

namespace A {
  namespace B {
    namespace { // Unnamed
    }
  }
}

// After

namespace A::B {
  namespace { // Forced to remain as a separate definition
  }
}

在研究了为什么会这样或者之前有人询问过这个问题之后,我无法提供有关此事的任何此类信息,标准似乎只给出了§10.3.1.9中定义的嵌套命名空间的小小摘要没有提到故意排除未命名的命名空间。鉴于实际定义和示例中提供的内容,包括更简洁形式的命名空间定义中的未命名命名空间似乎更符合将多个定义组合为一个的基本意图。

有没有理由不提供某种方法来允许这种行为,例如不想引入额外的异国语法,或者这是否是对其设计的疏忽?

0 个答案:

没有答案