禁止通过引用捕获

时间:2013-01-23 22:34:33

标签: c++ c++11 lambda

是否有一种棘手的方法可以防止通过引用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)。

2 个答案:

答案 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 &