我正在阅读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 ]:模板参数的名称不得在其范围内(包括嵌套范围)重新声明。...
那么有人可以给我一些帮助吗?谢谢!