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

Does lambda capture support variadic template arguments

本文关键字:参数 是否 支持 lambda      更新时间:2023-10-16

如果我能这样做就好了:

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: error: expected ',' before '…"令牌evtempl。Hh:75:54: error: expected identifier before…"令牌evtempl。Hh:75:57:错误:参数包没有用"…"展开:evtempl。Hh:75:57:注释:'args'evtempl。在lambda函数中:evtempl。Hh:76:26:错误:展开模式'args'不包含参数包evtempl。hh:在实例化'void elt::Event::operator()(PT…)[with RT = void;PT = {int}]':testevtempl。抄送:28:9:从这里开始evtempl。hh: 74:9:错误:使用无效的字段的英语教学::::操作符()(PT…)::::处理程序*)>::__args"evtempl。hh:在实例化'void elt::Event::operator()(PT…)[with RT = void;PT = {int, const char*}]':testevtempl。抄送:29:20:从这里开始evtempl。hh: 74:9:错误:使用无效的字段的英语教学::::操作符()(PT…)::::处理程序*)>::__args"

相反,我必须将该lambda更改为旧的、普通的语法:
for (itr = l.begin(); itr != l.end(); ++itr)
     (*(*itr))(args...);

这个可以编译并正常工作。

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

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

I tried

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

它给出的错误和你做的一样:

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

抱怨参数包未展开

这是gcc中的一个bug。参见[c++0x]lambda和可变模板不能一起工作或者[c++ 11] lambda表达式中的包展开失败