考虑以下代码:
#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 正确的吗?
- 上述用例是已知模式吗?它被认为是不好的做法吗?
- 除了让读者感到困惑之外,上面的代码是否会成为技术问题的根源?例如未定义的行为,或者编译器执行错误的简化假设?