lambda捕获是否支持可变参数模板参数

时间:2013-01-16 22:06:09

标签: c++ templates c++11 lambda

如果我能做到以下几点会很好:

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:错误:预期','在'...'标记之前   evtempl.hh: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 = void; PT = {int}]':   testevtempl.cc:28:9:从这里要求   evtempl.hh:74:9:错误:使用无效字段'elt :: Event :: operator()(PT ...):::: Handler *)&gt; :: __ args'   evtempl.hh:在'void elt :: Event :: operator()(PT ...)的实例化中[RT = void; PT = {int,const char *}]':   testevtempl.cc:29:20:从这里要求   evtempl.hh:74:9:错误:使用无效字段'elt :: Event :: operator()(PT ...):::: Handler *)&gt; :: __ args'

相反,我必须将lambda更改为旧的,平凡的语法:

for (itr = l.begin(); itr != l.end(); ++itr)
     (*(*itr))(args...);

这个编译并正常工作。

我想知道为什么lambda语法不起作用。

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

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

    它会产生与您相同的错误:

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

    抱怨参数包未展开

1 个答案:

答案 0 :(得分:6)