C++ 阴影参数C+的有趣案例+;(参数在if块中没有阴影)

C++ 阴影参数C+的有趣案例+;(参数在if块中没有阴影),c++,gcc,shadowing,C++,Gcc,Shadowing,我今天惊奇地发现以下代码是完全有效的(gcc 4.4.5): 我真的很惊讶。如果我必须接受它,那么我可以肯定地说它有一定的意义,因为新变量在它自己的块中,因此外部的其余代码仍然可以访问该参数,因此该参数实际上没有阴影。但我还是不明白为什么我们不把它变成无效的语法?我看不出允许这样做有什么好处,事实上,我只需要研究一下由此引起的一个bug。这是一个很长的函数,我创建了我自己的变量,但没有意识到它与参数同名,后来的一些代码行(同一块)依赖于这个参数变量,现在它使用我的版本,一天中有一个小时 我对编译

我今天惊奇地发现以下代码是完全有效的(gcc 4.4.5):

我真的很惊讶。如果我必须接受它,那么我可以肯定地说它有一定的意义,因为新变量在它自己的块中,因此外部的其余代码仍然可以访问该参数,因此该参数实际上没有阴影。但我还是不明白为什么我们不把它变成无效的语法?我看不出允许这样做有什么好处,事实上,我只需要研究一下由此引起的一个bug。这是一个很长的函数,我创建了我自己的变量,但没有意识到它与参数同名,后来的一些代码行(同一块)依赖于这个参数变量,现在它使用我的版本,一天中有一个小时


我对编译器有非常肤浅的了解,所以有人能给我解释一下这种行为背后的全部故事吗?作为比较,在Java代码中,这样的代码是无效的(重复变量)

传递的不是变量,而是引用。引用BjARNE StruouToup在<>强> C++编程语言<强> -“引用可以用来实现一个应该改变其参数值的函数”P.62

< P>如果你问为什么C++允许这个,答案很简单:为了接受有效的C代码。
它还简化了规则,以相同的方式处理不同作用域中同一标识符的不同含义,而不关心所涉及的作用域是名称空间、类、函数还是块作用域。

也不是编译器专家,但我怀疑该参数是int&和“阴影”变量只有一个int在循环中。我还尝试了
get_int(int I)
它没有区别
int I
的范围是声明它的块。这会使参数在块内阴影化,但不会在块外阴影化。如果你问“为什么变量的作用域是块而不是函数?”答案是“语言规则就是这么说的。”不同的语言遵循不同的规则。这就是它们的不同之处。这忽略了问题的重点,即“为什么允许我对参数进行部分阴影处理?”您没有理解问题。。对不起,我没有说得更清楚。我还传入了一个常量引用,这样就不会有什么不同了。我能再解释一下吗?你能说明一下这与接受C代码的关系有什么关系吗?C++的流行度取决于C++中的所有好的C代码都是可以接受的。
int get_int(const int& i)
{
    if(i == 0)
    {
        int i = 1;
        return i;
    }
    return i;       
}