c++ - 通过非常量引用参数修改 const 引用参数
问题描述
考虑以下代码:
#include <iostream>
void f(int const& a, int& b)
{
b = a+1;
}
int main() {
int c=2;
f(c,c);
std::cout << c << std::endl;
}
- 函数
f
有两个引用参数:int const& a
和int& b
. 因此,f
应该不修改a
,但可以修改b
,而且确实可以。 - 但是,在 中
main
,我传递了由和引用的同一个变量。作为修改,它也修改,它应该不应该修改a
b
f
b
a
此代码在没有任何警告的情况下编译并打印3
. 如果我们单独跟踪每个变量,看起来 const 正确性受到尊重:c
是非常量的,因此将它作为const
ref as传递a
,也可以作为非常量ref as 传递,并且在我们b
的主体内传递它是完全可以的f
modify b
,它是非常量的,而不接触a
,它是 const 。然而,当c
asa
和 as使用时b
,a
在 的主体内被修改f
,违反了 const 的假设a
,即使没有const_cast
调用显式。
我尽可能简单地制作了这个示例,但人们很容易想到不那么明显的用例(例如const
作用于非常量引用参数的方法)。
我的问题是:
- 我们真的可以说上面的代码是 const 正确的吗?
- 上述用例是已知模式吗?它被认为是不好的做法吗?
- 除了让读者感到困惑之外,上面的代码是否会成为技术问题的根源?例如未定义的行为,或者编译器执行错误的简化假设?
解决方案
但是,在 中
main
,我传递了由a
和引用的同一个变量b
。作为f
修改b
,它也修改a
,它应该不应该修改
f
修改所指的内容时b
,不修改a
. 它修改了a
所指的内容,但这没关系,因为b
is not const
。只有当您尝试a
通过使用来修改所指的内容时,您才会遇到a
问题。
我们真的可以说上面的代码是 const 正确的吗?
是的。您不修改 const 变量。
除了让读者感到困惑之外,上面的代码是否会成为技术问题的根源?例如未定义的行为,或者编译器执行错误的简化假设?
不,您的代码是合法的,并且会在所有符合标准的编译器上产生相同的结果。
一个常量引用参数不会产生它所引用的东西,const
如果它不是const
开始的话。它所做的只是阻止您使用引用来修改对象。另一个指向该对象的指针或引用仍然可以改变它,只要它不是const
它自己。
推荐阅读
- javascript - 不显示数组验证中对象的所有元素,只显示javascript中元素的最后一个变量
- leaflet - 如何在 Leaflet 地图上实现点击 + 按住(长按)?
- uwp - 为桌面桥应用程序创建应用程序包文件 -
- python - 如何在pyqt5中导入资源文件
- java - 为什么java中的静态方法同步不起作用?
- emacs - MS Windows 上的 emacs 初始化文件
- geometry - 当长度不相等时如何找到三角形的第三个顶点
- javascript - 在 DataTables 中显示“所有”页面以及响应式表和其他属性
- python - 我怎样才能让四个精灵循环起来,让它像一个 GIF 一样充当一个精灵?
- android - 如何从另一个模块应用插件