c – const函数与函子修改对象

如果我们考虑以下方法,我的印象是bar不能修改它(即它的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?
}

我看到方法栏不是“直接”修改其实例的值i,而是通过给定的参数func“间接”这样做.

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

最佳答案 酒吧没有修改我,你的lambda做了.

从本质上讲,你从课堂外抓住了对i的引用并将其填入lambda.然后你叫吧. bar没有提到自己的成员,它只调用了一些任意的(非成员,因此bar的常量是无关紧要的)它提供的功能.

你在这里的缺陷是,人们可以从结构外部获得对i成员的引用.这意味着任何人都可以摆弄我.让我私密,看看上面的效果如何.

点赞