1

是否有一种巧妙的方法可以防止对象通过引用被捕获到兰巴中?例如,我想禁止这样做:

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's 的合同,用户这样做确实很诱人。我可以根据需要自由包装、更改和以其他方式混淆 A。


编辑

创建 lambda 后,它将被移交给异步进程,而当前线程内联等待,直到该异步进程完成。 A是一个帮助了解异步操作何时完成的类(想想boost::future)。

4

2 回答 2

7

你不能那样做。任何类型的左值都T可以绑定到类型的变量T &。您不能阻止对象成为左值表达式(例如 id 表达式)的值。

于 2013-01-23T22:42:44.307 回答
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
}

所以你看,为了处理潜在的问题,现在你必须要么禁止构造函数或函数接受 type A &,要么禁止在类中存储类型A &

于 2013-01-23T23:50:53.757 回答