次の例では、私はVC++ 2010年に発生した問題を示していますlambdaから関数を呼び出す際の参照ルールは何ですか?
class Foo
{
template<class T>
static T foo(T t) { return t; }
public:
void test()
{
auto lambda = []() { return foo(1); }; // call to Foo::foo<int>
lambda();
}
};
VC++を生成します。エラーC3861:'foo'
を:この例Foo::foo(1);
:私はfooへの呼び出しを修飾した場合、識別子は
が見つかりません 警告C4573:'Foo::foo'
を使用すると、コンパイラは'this'
をキャプチャする必要がありますが、現在のデフォルトのキャプチャモードでは許可されません。
標準はこのケースについて何を言っていますか?修飾されていない名前が見つかるはずですか?修飾名はキャプチャする必要がありますthis
?
ええ、それは変です。それは静的なので、 'this'は必要ないはずです。私はそれがコンパイラのバグだと思うし、それを見つけられないということはコンパイラがコンパイラの副作用であると思っているので、それを使うのに 'this 'が必要だと思っている。 –
これはg ++でも起こりますので、バグのようには見えません。それを[]()の代わりに[&]()に変更すると、これはうまくコンパイルされますが、それはこれを参照するためです。 – DrYap
[別のスレッド](http://stackoverflow.com/questions/4940259/c0x-lambdas-require-capturing-this-to-call-static-member-function)はバグだと言っています。 – DrYap