禁止通过引用捕获

Prohibit capture by reference

本文关键字:引用 禁止      更新时间:2023-10-16

有没有一种棘手的方法可以防止对象被引用捕获到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 &