如果我们考虑以下方法,我会认为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
方法的函数)?
答案 0 :(得分:2)
bar
没有修改i
,你的lambda没有。
基本上,你从课堂外抓取了i
的引用,并将其填入lambda。然后你打电话给bar
。 bar
没有提到自己的成员,它只称一些任意的(非成员,因此bar
的常量是不相关的)函数。
你在这里遇到的缺陷是,人们可以从结构外部获得对i
成员的引用。这意味着其他任何人都可以摆弄i
。将i
设为私有,看看上面的效果如何。