是`使用命名空间std :: placeholders;`不符合?

时间:2015-01-12 14:00:48

标签: c++ language-lawyer

来自§2.10.3.2:

  

以下划线开头的每个标识符都保留给实现,以用作全局命名空间中的名称。

考虑到这一点,这个程序标准是否符合标准?因为它使全局命名空间中的_1等可用?或者可以,因为std::placeholders被视为“实施”?或者它是否正常,因为_1实际上不在全局命名空间中?还有别的吗?

using namespace std::placeholders;
int main(){}

1 个答案:

答案 0 :(得分:7)

我认为该计划很好。严格来说,using-directive不会将任何名称放入命名空间 - 它使名称可以通过名称查找到达,但实际上并不使它们成为包含using-directive的命名空间的成员。

引用C ++ 11,7.3.4:

  

2 using-directive 指定指定命名空间中的名称可以在其中使用的范围内使用    using-directive 出现在 using-directive之后。在非限定名称查找(3.4.1)期间,名称出现   好像它们是在最近的封闭命名空间中声明的,它包含 using-directive 和   提名命名空间。 [注意:在此上下文中,“包含”表示“直接或间接包含”。 末端   注意]

     

3 using-directive 不会将任何成员添加到它出现的声明区域。 ...

注意语言"可以使用," "好像他们被宣布"等。没有提到实际上使用不同名称空间的名称成员。

对于通过限定名称的访问,3.4.3.2(名称空间的限定名称查找)说:

  

2对于名称空间X和名称m,名称空间限定的查找集 S(X,m)定义如下:    S'(X,m)mX的所有声明的集合,X的内联命名空间集(7.3.1) 。如果 S'(X,m)不是   空, S(X,m) S'(X,m); 否则, S(X,m)是所有名称空间的 S(N i ,m)联合 N i 被提名   通过X中的 using-directives 及其内联命名空间集。

即,使用指令的单独规则。

我将从中得出结论,using-directive不会使任何名称成为命名空间的成员,因此不会触发_全局命名空间规则,也不会发生未定义的行为。