带函子修改对象的Const函数

const function with functor modifying object

本文关键字:Const 函数 对象 修改      更新时间:2023-10-16

如果我们考虑以下方法,我的印象是bar不能修改this(即Foo的实例)。

struct Foo {
  int i;
  // var shall not modify the respective instance of Foo, thus "const"
  void bar(std::function<void(int)> func) const {
    func(3);
  } 
};

然而,以下是可能的:

void anothermethod() {
  Foo f;
  f.bar([&](int x){f.i = 3;}); // modify Foo.i "within" Foo::bar const. Dangerous?
}

我看到方法bar不是"直接"修改其实例的值i,而是通过给定的参数func"间接"修改。

所以这里我的问题:做这样的事情是危险的(即传递一个将对象修改为相应对象的const方法的函数)?

bar没有修改i,是你的lambda修改了。

实际上是从类外部获取对i的引用,并将其塞进lambda。然后你打电话给barbar没有提到自己的成员,它只调用了它提供的某个任意(非成员,因此bar的const-ness无关)函数。

这里的缺陷是可以从结构体外部获得对i成员的引用。这意味着任何人都可以摆弄i。将i设置为私有,看看上面的工作效果如何。