GCC,clang和VS2013会编译以下代码段:

namespace A{}
int main()
{
    int A;
}

但是[namespace.alias]/4表示以下内容:





[basic.scope.declarative]/1说:



也就是说,我的印象是int中的main()变量不能与 namespace A具有相同的名称。观察到[basic.scope.declarative]/2中的示例似乎证实了这一点

最佳答案

从[basic.scope.declarative]中,“声明性区域”的定义为:



限制是,重点是:



回到您的示例。如果我们注释两个声明性区域,则有:

namespace A{}    + region #1
                 |
int main()       |           +
{                |           |
    int A;       |           | region #2
                 |           |
}                +           +
namespace A(#1)和int A(#2)的声明性区域不同(第二个是第一个的严格子集,但这无关紧要)。由于它们是不同的,因此对单个名称的限制不适用。 #2中只有一个A,而#1中只有一个A

但是,如果我们将int A移到了相同的声明性区域中:
namespace A {}     +   the only declarative region. even though the
int A;             |   potential scope of "int A" does not include
                   |   "namespace A", the declarative region does.
int main() {       |   The intent of this is expressed in the example
                   |   in [basic.scope.declarative]/2:
                   |        int main() {
                   |            int i = j, j;
                   |            j = 42;
                   |        }
                   |
                   |   "The declarative region of the [j] includes all
                   |    the text between { and }, but its potential scope
}                  +    excludes the declaration of i."

这将违反[basic.scope.declarative]/4,并且gcc和clang均正确拒绝代码,并带有:



请注意,正如Vaughn Cato所指出的,关于声明性区域的措辞有一个active defect report

08-25 01:20