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

C++ lambda捕获是否支持可变模板参数,c++,templates,c++11,lambda,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...); } ); } ... }; 这一个编译并运

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

template <class RT, class... PT>
class Event 
{
    ...
    void operator()(PT... args)
    {
        std::for_each(
            l.begin(), l.end(), [args...](Handler *p) { (*p)(args...); }
        );
    }
    ...
};
这一个编译并运行良好

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

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

    [=](Handler *p) { (*p)(args...); }
    
    它会给出与您相同的错误:

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

    抱怨参数包未展开

    这是gcc中的一个错误。查看或可能。

    您是否尝试过
    [=]
    替代?@Kerrek SB这是一个很好的建议,但如果您隔离lambda
    auto foo=[=](处理程序*p){(*p)(args…;},出现两个错误“1)参数包未展开,2)展开模式“args”不包含参数包”。我怀疑这是一个GCC错误,因为它抱怨ARG既不是一个包,也必须是一个包。看起来像是@致命吉他的复制品:这个问题是类似的。但是,这个问题使用显式捕获,而链接的问题是关于隐式捕获。事实上,它已经是一个bug很长时间了,据我所知,它在gcc 4.8和clang中仍然是一个bug。@gnzlbg,它不是clang中的bug。@chico Cool!谢谢我不知道它已经响了!如果仅扩展
    f(args)
    f(arg1),f(arg2)会起作用…@gnzlbg有一种黑客仅仅为了副作用而扩展包模式:
    std::initializer_list{(void(f(args)),0)。你可以把它放在宏或别的什么东西里。请注意,
    {}
    -初始化保证计算顺序。
    f(args),0
    执行f(args),并计算为零(如果不熟悉,请查找逗号运算符)。我在f附近添加了
    void
    ,以防止可能重载的逗号运算符,我们不想在这里使用它(因为不能使用void参数重载它)。所以我只是建立了一个充满零的初始值设定项列表,它恰好执行了所有这些副作用。初始值设定项列表将立即被丢弃。应该没有开销。最坏的情况是编译器在可执行文件中存储一个只读的静态零数组,但我希望编译器意识到它没有被使用。
    [args](Handler *p) { (*p)(args...); }