具有捕获引用的长寿命(非本地)λ
Long lived (nonlocal) lambda with captured reference
本文关键字:引用 更新时间:2023-10-16
>问题已更新以显示更完整的示例。
我最近发现我正在使用的库有一段代码,它实现了类似于以下功能的内容:
class Foo {
std::function<void()> FuncPtr;
public:
template <typename Type>
void setBar(std::set<Type> &bar) {
FuncPtr = [&bar](){
//Do something with bar
};
}
void useBar() {
FuncPtr();
}
};
这对我来说似乎很危险,因为无法保证在调用Foo::useBar()
时bar
引用的变量仍然存在。话虽如此,对bar
的要求已记录在案。
在长寿命(非局部(lambda中捕获引用的共识是什么?
当向库的维护者询问是否让 lambda 捕获引用时,给出的原因是他希望在调用Foo::setBar()
后可以修改变量(bar
引用(。实现相同功能的另一种解决方案可能是bar
成为shared_ptr<int>
但也许这太严厉了。
还有其他好的替代方案可以使代码"安全"吗?
捕获引用并不比捕获指针更危险或更少。唯一的区别是,与使用引用相比,您可能更有可能谨慎使用原始指针并考虑其生存期。
正如您所说,安全的方法是使用shared_ptr
.这是否太重量级取决于您的应用程序,如果您主要只是调用useBar()
那么取消引用shared_ptr
是相当便宜的。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 如何引用基类的派生类?