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の契約を考えると、ユーザーがこれを行うのは本当に魅力的です。必要なだけ A をラップ、変更、またはその他の方法で難読化する自由があります。


編集

ラムダが作成されると、非同期プロセスに渡され、現在のスレッドはその非同期プロセスが完了するまでインラインで待機します。 A非同期操作がいつ完了するかを知るのに役立つクラスです ( と考えてboost::futureください)。

4

2 に答える 2

7

そんなことはできません。type の左辺値は、 typeTの変数にバインドできますT &。オブジェクトが左辺値式 (id-expression など) の値になることを防ぐことはできません。

于 2013-01-23T22:42:44.307 に答える
0

ラムダは、関数オブジェクトのシンタックス シュガーにすぎません。上記のラムダは、基本的に次のようなものと同等です。

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 に答える