如果我们考虑以下方法,我的印象是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成员的引用.这意味着任何人都可以摆弄我.让我私密,看看上面的效果如何.