8

如果我能做到以下几点就好了:

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 语法不起作用。

  1. 我做错了什么或错过了什么?
  2. 在 c++11 标准中这样的事情是非法的吗?
  3. 或者,这是标准允许的,但这是当前编译器的问题?

我试过

[=](Handler *p) { (*p)(args...); }

它给出的错误与您所做的相同:

[args](Handler *p) { (*p)(args...); }

抱怨参数包未扩展

4

1 回答 1

7

这是 gcc 中的一个错误。请参阅[c++0x]lambdas and variadic templates don't work together或者[C++11] Pack expansion failed in lambda expressions

于 2013-01-16T22:23:21.880 回答