隐藏c++参数的有趣案例(参数没有在if块中隐藏)
Interesting case of shadowing parameter C++ (parameter not shadowed in an if block)
今天我惊讶地发现下面的代码是完全有效的(gcc 4.4.5):
int get_int(const int& i)
{
if(i == 0)
{
int i = 1;
return i;
}
return i;
}
我真的很惊讶。如果我必须接受它,那么我当然可以说它是有意义的,因为新变量在它自己的块中,所以外部的其他代码仍然可以访问参数,所以参数并没有真正被遮蔽。但它仍然没有意义,我为什么我们没有使这是一个无效的语法?我看不出允许这样做有什么好处,事实上,我不得不深入研究由此引起的一个bug。这是一个很长的函数,我创建了我自己的变量,却没有意识到它和参数有相同的名字,在几行代码之后(同一个代码块),它依赖于那个参数变量,然后砰的一声,现在它使用了我的版本,我一天中的一个小时就这样过去了。我对编译器的了解非常肤浅,所以有人能给我解释一下这种行为背后的全部故事吗?作为比较,在Java代码中这样是无效的(重复变量)。
如果你问为什么c++允许这样做,答案很简单:为了接受有效的C代码。
它还使规则更简单,以相同的方式处理不同作用域中相同标识符的不同含义,而不关心所涉及的作用域是名称空间、类、函数还是块作用域。
您传递的不是变量而是引用。引用Bjarne Stroustroup在 中的语句- "一个引用可以用来实现一个应该改变其参数值的函数" p.62
相关文章:
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 参数包构造函数在类模板中隐藏用户定义的转换
- C++ [错误] 声明'char '隐藏参数。什么意思?
- 'int a'声明隐藏参数
- 如何隐藏模板基类的参数类型
- 在c++中隐藏不同的std::map比较参数
- 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?
- 使用函数参数隐藏成员函数
- 函数的隐藏/锚定参数?
- 在 std::variant 中隐藏模板参数
- 视觉C++:即使使用关键字,参数声明也会隐藏类成员"this"
- 成员模板模板参数的隐藏
- 模板参数名称隐藏
- 前向声明从嵌套模板中隐藏祖先模板参数
- 为什么我在child中更改了父虚函数参数隐藏了父函数c++
- 如何在gcc错误消息中隐藏默认模板参数
- 隐藏c++参数的有趣案例(参数没有在if块中隐藏)
- 基类模板成员函数隐藏在派生类中,尽管参数列表不同
- 方法中的默认模板参数隐藏在类默认模板参数后面
- C++这个指针,在函数调用中隐藏参数