【发布时间】:2015-07-30 17:07:15
【问题描述】:
为什么不能在函数内部重新声明限定名?
以下代码编译失败(在MSVC2015和clang中)
int i;
namespace N
{
int j;
}
void foo()
{
extern int i;
extern int i;
extern int N::j;
extern int N::j;
}
int main()
{
return 0;
}
但是,如果我们将两行 extern int N::j; 移动到 void foo() 之前,那么代码编译得很好。
更新值得注意的是
- 不合格名称的重复声明确实有效,
-
::i和::N::j都已在各自的声明中定义, -
::N::j对foo不可见 - 语法确实允许
extern int ::N::j并且它不是一个定义 - 以下代码也失败了(感谢 T.C. 指出这一点)
.
int i;
void foo()
{
extern int ::i;
}
- 以下代码在 MSVC 中有效,但在 clang 中发出警告
.
int i;
extern int ::i;
【问题讨论】:
-
与重复无关。即使
void foo() { extern int N::j; }也无法编译。 -
@T.C.更新的问题(谢谢)。
标签: c++ c++11 language-lawyer