是否有一种棘手的方法可以防止通过引用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
)。
答案 0 :(得分:7)
你做不到。类型T
的任何左值都可以绑定到T &
类型的变量。您无法阻止对象成为左值表达式的值(例如,id-expression)。
答案 1 :(得分:0)
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 &
。