C++ 标准的哪个子条款禁止在同一块中重新声明/重新定义?

Xua*_*nsr 5 c++ language-lawyer

我正在阅读C++ 编程语言标准,但找不到禁止如下代码的子条款,这些代码显然无法编译:

/* Code A */
int main() {
  int i;
  int i;
}
Run Code Online (Sandbox Code Playgroud)

而这个将编译:

/* Code A */
int main() {
  int i;
  int i;
}
Run Code Online (Sandbox Code Playgroud)

我找到了一些相关的东西,但我找不到匹配的东西:

[ basic.def.odr#1 ]:任何翻译单元都不得包含任何变量的多个定义...

如果是这个子条款,我找不到一个子条款来解释为什么 2i在代码 B 中不是相同的变量,但在代码 A 中是相同的变量;

[ basic.scope.block#1 ]:块([stmt.block])中声明的名称是该块的本地名称;它具有块作用域。它的潜在作用域从其声明点 ([basic.scope.pdecl]) 开始,到其块的末尾结束。在块作用域声明的变量是局部变量。

事实上,我试图寻找类似或更通用的东西,而不是“具有块作用域的变量名称不能在其潜在作用域内重新声明,不包括嵌套块”,例如[ temp.local#6 ],但我失败了:

[ temp.local#6 ]:模板参数的名称不得在其范围内(包括嵌套范围)重新声明。...

那么有人可以给我一些帮助吗?谢谢!

Nat*_*ica 4

您正在寻找[basic.scope.scope]/5

如果两个声明对应并导致它们的共享名称表示不同的实体([basic.link]),则它们可能会发生冲突。如果在任何范围内,一个名称绑定到两个可能发生冲突的声明,并且一个声明在另一个声明之前([basic.lookup]),则该程序是格式错误的。

强调我的