我試圖在構造函數初始化列表中的lambda中捕獲可變參數。這是一個說明問題的簡單例子。Lambda在構造函數初始化列表中捕獲可變參數
#include <functional>
#include <iostream>
void foo(int a)
{
std::cout << a << std::endl;
}
template<typename ...Args>
class Widget
{
public:
Widget(std::function<void(Args...)> f, Args... args)
: _f([=]() { f(args...); }) // compiler error here
{
}
void print() const { _f(); }
private:
std::function<void()> _f;
};
int main(int argc, char* argv[])
{
Widget<int> w(foo, 7);
w.print();
return 0;
}
在VS2013我得到以下編譯錯誤:
error C3546: '...' : there are no parameter packs available to expand
error C2065: 'args' : undeclared identifier
的Widget
構造編譯和工作的下列版本。
Widget(std::function<void(Args...)> f, Args... args)
{
_f = [=]() { f(args...); };
}
Widget(std::function<void(Args...)> f, Args... args)
: _f(std::bind(f, args...))
{
}
更新:的微軟的Visual C++編譯器團隊已經修復了這個問題,將其納入在Visual C++(see)即將發佈。
看起來像是另一個bug。 – 0x499602D2
是的,它看起來像一個錯誤。我已經向MS Connect提交了一份報告。 – Frank