禁止通过引用捕获
Prohibit capture by reference
有没有一种棘手的方法可以防止对象被引用捕获到lamba中? 例如,我想禁止这样做:
class A {};
void Foo()
{
A a;
auto lamda = [&a](){}; // Disallow this
// give lambda to async process
// use A to help know when the lamda finally gets called
}
我想防止这种情况,因为在这种情况下A
很容易被滥用,所以我想防止用户伤害自己。 有人可能会争辩说任何类都可以被滥用,但考虑到A
的契约,用户这样做真的很诱人。 我可以根据需要自由地包装、更改和以其他方式混淆 A。
编辑
创建 lambda 后,它被传递给异步进程,而当前线程以内联方式等待,直到该异步进程完成。 A
是一个类,用于帮助了解异步操作何时完成(想想boost::future
)。
你不能
那样做。任何类型 T
的左值都可以绑定到 T &
类型的变量。您无法阻止对象成为左值表达式(例如 id 表达式)的值。
lambda 只是函数对象的语法糖。上面的 lambda 本质上等效于这样的东西:
class SomeAnonymousFunctor {
A &a;
public:
SomeAnonymousFunctor(A &foo) : a(foo) {}
void operator()() const {}
};
void Foo()
{
A a;
auto lamda = SomeAnonymousFunctor(a); // Disallow this
}
所以你看,为了处理潜在的问题,现在你必须禁止接受类型A &
的构造函数或函数,或者不允许在类中存储类型A &
。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 返回 T 引用的 Const 函子禁止赋值
- 常量引用函数参数:是否可以禁止临时对象?
- 如何在采用常量引用的函数中禁止临时
- 为什么std::变体中禁止引用
- 有没有办法禁止将临时绑定到常量引用
- C 禁止将铸件引用到RVALUE参考
- 禁止传递对函数的右值引用
- 禁止显示编译器警告 声明从未引用的函数
- 为什么禁止对位域进行非常量引用
- 是否可以通过常量引用获取参数,同时禁止转换,以便不传递临时变量?
- 在 QT 中,错误:ISO C++禁止转发对'enum'类型的引用
- 禁止通过引用捕获