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

Omn*_*ity 4 c++ language-lawyer

从§2.10.3.2开始:

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

考虑到这一点,这个程序标准是否符合标准?因为它_1可以从全局命名空间中获得等等吗?或者它是否正常,因为std::placeholders被认为是"实施"?或者它是否可以,因为_1实际上并不在全局命名空间中?别的什么?

using namespace std::placeholders;
int main(){}
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 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)min 的所有声明的集合,X并且内联命名空间集合为X(7.3.1) ).如果S'(X,m)不为空,则S(X,m)S'(X,m); 否则,S(X,M)是的并集S(N ,M)对所有名字空间Ñ 提名using指令X其内联的命名空间集合.

即,使用指令的单独规则也是如此.

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