2012-08-03 66 views
1
template <typename T, typename Y, typename... Args> 
class Bar 
{ 
    T& t; 
public: 
    Bar(T& t) : t(t) { } 
}; 

template <typename T, typename... Args> 
void Foo(T &function) { new Bar<T, void, Args...>(function); } 

int main() 
{ 
    auto foo = [] { }; 
    Foo(foo); // ok 

    Foo([] { }); // fails (tested on GCC 4.5.3) 
} 

爲什麼只有當lambda表達式作爲Foo的參數內聯寫入lambda表達式時纔會失敗?內聯lambda表達式導致編譯器錯誤

回答

5
template <typename T, typename... Args> 
void Foo(T &function) { new Bar<T, void, Args...>(function); } 

Foo([] { }); // fails (tested on GCC 4.5.3) 

Lambda是臨時的。不要嘗試將臨時引用綁定到引用。使用值,或const-reference或rvalue-reference。

+0

謝謝!海灣合作委員會的錯誤消息不是太有用。 – 2012-08-03 03:11:24