如果我能做到以下几点就好了:
template <class RT, class... PT>
class Event
{
...
void operator()(PT... args)
{
std::for_each(
l.begin(), l.end(), [args...](Handler *p) { (*p)(args...); }
);
}
...
};
不幸的是,我无法使用 g++ 4.7.2 (-std=c++0x) 编译它:
evtempl.hh:在成员函数'void elt::Event::operator()(PT ...)'中:evtempl.hh:75:54:错误:预期','在'...'标记之前:75:54: 错误: '...' 标记之前的预期标识符 evtempl.hh:75:57: 错误: 参数包没有用'...'扩展: evtempl.hh:75:57: 注意: 'args' evtempl.hh:在 lambda 函数中:evtempl.hh:76:26:错误:扩展模式 'args' 不包含参数包 evtempl.hh:在 'void elt::Event::operator()(PT ... ) [RT = 无效;PT = {int}]': testevtempl.cc:28:9: 这里需要 evtempl.hh:74:9: 错误: 使用无效字段 'elt::Event::operator()(PT ...):: ::Handler*)>::__args' evtempl.hh: 在 'void elt::Event::operator()(PT ...) [with RT = void; PT = {int, const char*}]'
相反,我必须将该 lambda 更改为旧的、普通的语法:
for (itr = l.begin(); itr != l.end(); ++itr)
(*(*itr))(args...);
这个编译并且工作正常。
我想知道为什么 lambda 语法不起作用。
- 我做错了什么或错过了什么?
- 在 c++11 标准中这样的事情是非法的吗?
- 或者,这是标准允许的,但这是当前编译器的问题?
我试过
[=](Handler *p) { (*p)(args...); }
它给出的错误与您所做的相同:
[args](Handler *p) { (*p)(args...); }
抱怨参数包未扩展