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)
我认为该计划很好.严格地说,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不会使任何名称成为命名空间的成员,因此_不会触发全局命名空间规则,也不会发生未定义的行为.
| 归档时间: |
|
| 查看次数: |
481 次 |
| 最近记录: |