带函子修改对象的Const函数
const function with functor modifying object
如果我们考虑以下方法,我的印象是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。然后你打电话给bar
。bar
没有提到自己的成员,它只调用了它提供的某个任意(非成员,因此bar
的const-ness无关)函数。
这里的缺陷是可以从结构体外部获得对i
成员的引用。这意味着任何人都可以摆弄i
。将i
设置为私有,看看上面的工作效果如何。
相关文章:
- 在 const 函数中通过引用和指针返回之间的区别
- 使用 std::string () const 函数启动线程或未来
- 如果我在 const 函数上使用指针,我可以返回什么?
- 为什么 const 函数返回左值而不是右值?
- 当我调用 main 中使用 const 对象的 const 函数时,不断出现错误
- 在 const 对象上调用非 const 函数
- 析构函数是否可以在 const 对象上调用非 const 函数
- C/C++ 如何在一次函数调用中交出 const 函数指针或简单指针
- 为什么我可以在C 11中使用const函数修改类
- 防止const函数被调用非const对象
- 如果C 中的支架重载运算符被声明为const函数
- C++:防止在 const 函数中更改指针的值
- 从const函数返回非const属性参考
- 调用指针参数从const函数指向的对象的操作员
- 在const函数中调用非CONST成员的非const函数
- 无法将 const 数据类型传递到非 const 函数中
- 这是检查 const 函数(如果是否创建某些内容)的更好方法
- 在 const 函数中从地图中未经选中读取
- 编译器不会为 "const" 和"not-const"函数给出不明确的错误吗
- 通过const函数中的参数索引返回std :: map的值