重新定义范围内的变量

Han*_*lil 3 c++ compiler-errors g++

为什么以下代码在g ++下编译时没有任何警告或错误?我看到的问题是第一行中定义的变量x可以在if范围内访问,但尽管它再次被重新定义.

int main() {
    int x = 5;
    std::cout << x;
    if (true) {
        int x = 6;
        std::cout << x;
    }
}
Run Code Online (Sandbox Code Playgroud)

ame*_*yCU 5

根据C-

C99中的6.2.1:

如果声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表中,则标识符具有块作用域,该作用域终止于关闭相关块的}

...

如果词法相同的标识符的外部声明存在于同一名称空间中,则它将被隐藏,直到当前作用域终止,之后它再次变为可见.

在C和C++中,在多个范围内使用相同名称是合法的.

所以在你的代码中,前一个i仍然是隐藏的,直到if语句的范围终止.


Vic*_*voy 4

C++ 标准允许名称隐藏,这意味着您可以在嵌套作用域中声明具有相同标识符的任何内容。

来自N4296

3.3.10 名称隐藏 [basic.scope.hiding]

  1. 可以通过在嵌套声明性区域或派生类中显式声明同名来隐藏名称。
  2. 类名 (9.1) 或枚举名称 (7.2) 可以通过在同一范围内声明的变量、数据成员、函数或枚举器的名称来隐藏。如果类或枚举名称和变量、数据成员、函数或枚举器在同一范围内(以任何顺序)以相同名称声明,则无论变量、数据成员、函数或枚举器在何处,类或枚举名称都会隐藏。枚举器名称可见。
  3. 在成员函数定义中,块作用域中名称的声明隐藏了具有相同名称的类成员的声明;见 3.3.7。派生类中成员的声明(第 10 条)隐藏了同名基类成员的声明;见 10.2。
  4. 在查找由命名空间名称限定的名称期间,原本通过 using 指令可见的声明可以通过包含 using 指令的命名空间中具有相同名称的声明来隐藏;见(3.4.3.2)。
  5. 如果名称在范围内且未隐藏,则称其可见

列表中的1 项就是您所需要的。