阴影参数C ++的有趣情况(参数未在if块中隐藏)

时间:2013-05-06 18:24:47

标签: c++ gcc shadowing

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

int get_int(const int& i)
{
    if(i == 0)
    {
        int i = 1;
        return i;
    }
    return i;       
}

我真的很惊讶。如果我必须接受它,那么我肯定可以说它有意义,因为新变量在它自己的块中,所以外面的其余代码仍然可以访问参数,因此参数不是真正的阴影。但是对我来说仍然没有意义,为什么我们不能使这个语法无效?我认为不允许这样做有什么好处,事实上,我只需要深入研究由此造成的错误。这是一个很长的函数,我创建了自己的变量而没有意识到它与参数具有相同的名称,并且稍后的某些代码行(相同的块)依赖于该参数变量,现在它正在使用我的版本我的日子里有一个小时。

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

2 个答案:

答案 0 :(得分:1)

如果您问为什么C ++允许这样做,答案很简单:为了接受有效的C代码。

它还使规则更简单,以相同的方式处理不同作用域中相同标识符的不同含义,而不关心涉及的作用域是名称空间,类,函数还是块作用域。

答案 1 :(得分:-4)

您没有传递变量而是传递引用。引用Bjarne Stroustroup的 C ++编程语言 - “引用可用于实现一个应该改变其参数值的函数”p.62