lambda捕获是否支持可变的模板参数?
Does lambda capture support variadic template arguments
如果我能这样做就好了:
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):
相反,我必须将该lambda更改为旧的、普通的语法: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"
for (itr = l.begin(); itr != l.end(); ++itr)
(*(*itr))(args...);
这个可以编译并正常工作。
我想知道为什么lambda语法不工作。
- 我做错了什么还是错过了什么?
- 这样的事情在c++11标准中是非法的吗?
- 或者,这是标准允许的,但它是当前编译器的问题?
I tried
[=](Handler *p) { (*p)(args...); }
它给出的错误和你做的一样:
[args](Handler *p) { (*p)(args...); }
抱怨参数包未展开
这是gcc中的一个bug。参见[c++0x]lambda和可变模板不能一起工作或者[c++ 11] lambda表达式中的包展开失败
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 如何检查给定的参数是否为 cv::noArray()?
- 如果返回 -1,时间() 的参数是否被修改?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 检查两个模板参数是否相同
- 空函数的参数是否加载到缓存中?
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- 了解'this'或其他参数是否为右值
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- shared_ptr构造函数参数是否应按值传递
- 如何检查模板参数是否为给定值?
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 在对象序列化期间添加额外参数是否有更好的方法?
- 通过 ssh 发送参数.是否有非阻塞输入函数?
- 如何检查运算符 != 模板参数是否存在 C++ 17?
- 常量引用函数参数:是否可以禁止临时对象?
- 如何检查模板参数是否为 std::variant?
- 是否可以确定函数的参数是否已签名或无符号,以实现可能性超载函数
- 移动 l 值参考参数是否是一种不好的做法?
- 显式指定通用 lambda 的 operator() 模板参数是否合法?