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。