2011-10-19 5 views
8

次のコードを検討してください。なぜ私はラムダによって "this"ポインタをキャプチャするのに失敗していますか?

class A 
{ 
public: 
    void foo() 
    { 
     auto functor = [this]() 
      { 
       A * a = this; 
       auto functor = [a]() // The compiler won't accept "this" instead of "a" 
        { 
         a->bar(); 
        }; 
      }; 
    } 

    void bar() {} 
}; 

VC2010では、aの代わりにthisを使用すると、コンパイルエラーが発生します。他の中で:

1>main.cpp(20): error C3480: '`anonymous-namespace'::<lambda0>::__this': a lambda capture variable must be from an enclosing function scope 
1>main.cpp(22): error C3493: 'this' cannot be implicitly captured because no default capture mode has been specified 

私は理解しません。参照を使うべきかそれをコピーするのか分からないということですか? &this&this

一時的ではありませんが、奇妙なことですが、好奇心のために、それを取り除く方法はありますか? thisがラムダに与えられたらどうなるの?

+2

GCC 4.6.1では '[this]'でもうまく動作します。 –

+0

@KerrekSBお役立ち情報...テストをありがとう! – Gabriel

+4

これは[バグ#560907](https://connect.microsoft.com/VisualStudio/feedback/details/560907/capturing-variables-in-nested-lambdas)(残念ながら 'WONTFIX'として閉じられました)のように見えます。 –

答えて

6

これはVS2010のコンパイラの不具合のようです。

class A 
{ 
public: 
    void foo() 
    { 
     auto functor = [this]() 
     { 
      auto functor = [=]() 
      { 
       bar(); 
      }; 
     }; 
    } 

    void bar() {} 
}; 

参照し、強制的にこの&を使用しようと、それはまた、言う::

1>のメインIは、暗黙的にthisをキャプチャすることは、内側ラムダをさせることで動作させることができました。 CPP(20):エラーC3496: 'この' は常に値によって捕獲された: '&' は無視

thisは値でしかキャプチャできません。 [=][&]はどちらも値で取得します。これは、ラムダに与えられたときに何が起こるのか

ラムダオブジェクトへのポインタとしてthisをラムダに使用できないため、これは特別なものでなければなりません。その他をキャプチャしたはラムダのプライベートメンバーになるので、おそらくthisもありますが、使い方については特別な扱いがあります。

2

This is a known bug with the Visual Studio 2010 compiler(フレデリック・ハミディさんのコメントによって参照されます)。

あなたは明示的に別のラムダのキャプチャ仕様にそれを渡すためにthisをキャプチャする必要があります。これはラムダを囲むラムダの外側で宣言されたローカル変数にも適用され、[&]のキャプチャ仕様であっても適用されます。

関連する問題