const函数与函子修改对象

时间:2014-08-22 08:59:22

标签: c++ const functor

如果我们考虑以下方法,我会认为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方法的函数)?

1 个答案:

答案 0 :(得分:2)

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

基本上,你从课堂外抓取了i的引用,并将其填入lambda。然后你打电话给barbar没有提到自己的成员,它只称一些任意的(非成员,因此bar的常量是不相关的)函数。

你在这里遇到的缺陷是,人们可以从结构外部获得对i成员的引用。这意味着其他任何人都可以摆弄i。将i设为私有,看看上面的效果如何。