来自§2.10.3.2:
以下划线开头的每个标识符都保留给实现,以用作全局命名空间中的名称。
考虑到这一点,这个程序标准是否符合标准?因为它使全局命名空间中的_1
等可用?或者可以,因为std::placeholders
被视为“实施”?或者它是否正常,因为_1
实际上不在全局命名空间中?还有别的吗?
using namespace std::placeholders;
int main(){}
答案 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)是m
中X
的所有声明的集合,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不会使任何名称成为命名空间的成员,因此不会触发_
全局命名空间规则,也不会发生未定义的行为。