2011-09-02 94 views
6

下面的例子演示了我在VC中遇到的問題++ 2010:找不到從lambda調用函數時的查找規則是什麼?

如果我有資格調用foo的標識::Foo::foo(1);那麼這個例子

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'編譯時出現警告: 警告C4573:使用'Foo::foo'要求編譯器捕獲'this',但當前的默認捕獲模式不允許它

標準對這種情況說了什麼?是否應該找到不合格的名字?合格的名稱是否需要捕獲this

+0

嗯,這很奇怪。它是靜態的,所以它不需要'this'。我懷疑這是編譯器錯誤,沒有發現它是編譯器認爲它需要'this'來使用它的副作用。 –

+0

這也發生在g ++上,所以它看起來不像一個bug。如果你把它改成[&]()而不是[](),那麼這個編譯好,但這是因爲它通過引用。 – DrYap

+0

說了[另一個線程](http://stackoverflow.com/questions/4940259/c0x-lambdas-require-capturing-this-to-call-static-member-function)說這是一個錯誤。 – DrYap

回答

4

在許多情況下,微軟已經看到這個問題有報道。請參閱:

Scope Resolution with lambdas interferes with namespace and type resolution

Template resolution in lambdas

正如您所發現的,明確的分辨率使得它能夠找到該名稱。還有一個額外的警告,這也是一個編譯器錯誤(名稱解析不需要訪問這個,雖然我可以看到編譯器實現可能需要它) - 但它是一個單獨的錯誤。微軟已經證實這是一個錯誤,顯然已經爲下一個版本準備了一個修補程序。

2

以下編譯正常。在我看來,這只是一個模板的VS錯誤。

struct Foo { 
    static void foo() {} 
    void bar() { 
     auto f = []() { foo(); }; 
     f(); 
    } 
}; 
+0

你試過什麼編譯器?看起來結果取決於編譯器,因此瞭解標準符合行爲很重要。 –

+0

@Gene:VC++ 2010實現了lambdas預[N2927](http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2009/n2927.pdf),所以它是**不* *符合FDIS的措詞。 – ildjarn