首页 > 解决方案 > 通过非常量引用参数修改 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;
}

此代码在没有任何警告的情况下编译并打印3. 如果我们单独跟踪每个变量,看起来 const 正确性受到尊重:c是非常量的,因此将它作为constref as传递a,也可以作为非常量ref as 传递,并且在我们b的主体内传递它是完全可以的fmodify b,它是非常量的,而不接触a,它是 const 。然而,当casa和 as使用时ba在 的主体内被修改f,违反了 const 的假设a,即使没有const_cast调用显式。

我尽可能简单地制作了这个示例,但人们很容易想到不那么明显的用例(例如const作用于非常量引用参数的方法)。

我的问题是:

标签: c++pass-by-referenceconst-correctnesspass-by-const-reference

解决方案


但是,在 中main,我传递了由a和引用的同一个变量b。作为f修改b,它也修改a,它应该不应该修改

f修改所指的内容时b,不修改a. 它修改了a所指的内容,但这没关系,因为bis not const。只有当您尝试a通过使用来修改所指的内容时,您才会遇到a问题。

我们真的可以说上面的代码是 const 正确的吗?

是的。您不修改 const 变量。

除了让读者感到困惑之外,上面的代码是否会成为技术问题的根源?例如未定义的行为,或者编译器执行错误的简化假设?

不,您的代码是合法的,并且会在所有符合标准的编译器上产生相同的结果。


一个常量引用参数不会产生它所引用的东西,const如果它不是const开始的话。它所做的只是阻止您使用引用来修改对象。另一个指向该对象的指针或引用仍然可以改变它,只要它不是const它自己。


推荐阅读