Sup*_*mum 6 c++ using-directives using-declaration language-lawyer name-lookup
根据c ++标准,以下程序是否格式良好或格式不正确?
namespace N { int i; }
using namespace N;
using ::i;
int main() {}
Run Code Online (Sandbox Code Playgroud)
我用不同的编译器得到不同的结果:
根据c ++标准,该程序是否格式良好或格式不正确?需要参考c ++标准.
我正在试图找出应该提交错误的编译器.
良好的.
该using指令不引入名称i在全局命名空间,但它查找中使用.在using声明使用合格的查找找到i; 在使用指令的情况下进行限定查找在[3.4.3.2 p1,p2]中指定(引用来自N4527,当前的工作草案):
如果嵌套的名称说明符一个的合格-ID提名一个命名空间(包括其中的情况下嵌套的名称说明符的
::,即提名的全局命名空间),后指定的名称 嵌套名称-符被查找在命名空间的范围.[...]对于命名空间
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其内联的命名空间集合.
因此,对于限定查找,第一步是i直接在由nested-name-specifier指定的命名空间中查找make的声明(::在本例中).没有这样的声明,因此查找然后进入第二步,即在全局命名空间中i由using-directives指定的所有命名空间中形成由限定查找找到的所有声明的集合.该集合由N::i名称查找的结果组成,并通过using声明在全局名称空间中作为名称引入.
我发现值得注意的是(尽管非常明显)这种限定查找的定义是递归的:在引用中使用符号,在每个命名空间中使用限定查找N i将首先查找直接在N i中生成的声明,然后,如果没有找到,将依次进行由提名的命名空间看using指令在ñ 我,等等.
对于它的价值,MSVC也接受代码.
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |