C++ 范围内变量的重新定义

C++ 范围内变量的重新定义,c++,compiler-errors,g++,C++,Compiler Errors,G++,为什么下面的代码在g++下编译时没有任何警告或错误? 我看到的问题是,第一行中定义的变量x在if范围内是可访问的,但尽管它被重新定义 int main() { int x = 5; std::cout << x; if (true) { int x = 6; std::cout << x; } } intmain(){ int x=5; std::coutC++标准允许名称隐藏,这意味着您可以在嵌套作用域中

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

int main() {
    int x = 5;
    std::cout << x;
    if (true) {
        int x = 6;
        std::cout << x;
    }
}
intmain(){
int x=5;

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

发件人:

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

  • 名称可以通过嵌套声明性区域或派生类中相同名称的显式声明隐藏
  • 类名(9.1)或枚举名(7.2)可以通过中声明的变量、数据成员、函数或枚举数的名称隐藏 相同的作用域。如果类或枚举名称和变量 成员、函数或枚举数在同一范围内声明(在任何 顺序),则类或枚举名称将隐藏 变量、数据成员、函数或枚举器名称所在的位置 看得见
  • 在成员函数定义中,块作用域的名称声明隐藏具有相同名称的类的成员声明 名称;参见3.3.7。派生类中成员的声明 (第10条)隐藏了 名称相同;见10.2
  • 在查找由命名空间名称限定的名称的过程中,可以使用using指令使其可见的声明 可以由命名空间中具有相同名称的声明隐藏 包含使用指令;参见(3.4.3.2)
  • 如果名称在范围内且未隐藏,则称其为可见

  • 1项是您所需要的。

    第二个
    x
    变量有一个块作用域,并且隐藏了前面的
    x
    声明。

    用于打印代码最后一行的
    x
    属于
    if
    块。此
    x
    隐藏了在中声明的第一个
    x
    第一行。这是因为范围

    int main() {
        int x = 5;    //Accessble throughout the main.
        std::cout << x;
        if (true) {
            int x = 6;   //Local to this if block. Not accessible outside if block
            std::cout << x;   //Prints local x's value
    
        }
    }
    
    intmain(){
    int x=5;//可在整个主进程中访问。
    
    标准::根据
    C
    -

    6.2.1在C99中:

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

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

    <>在C和C++中,在多个范围内使用同名是合法的。
    因此,在您的代码中,前面的
    i
    保持隐藏状态,直到
    语句的作用域终止。

    变量阴影就是您要寻找的。要捕捉到这一点。