C++0x lambda 返回值类型推断规则
考虑以下 VC++ 10.0 代码中的两个 lambda 函数:
template <typename T>
void eq(uint fieldno, T value) {
table* index_table = db.get_index_table(fieldno);
if (index_table == nullptr) return;
std::set<uint> recs;
index_table->scan_index<T>(value, [&](uint recno, T n)->bool {
if (n != value) return false;
recs.insert(recno);
return true;
});
add_scalar_hits(fieldno, recs).is_hit =
[=](tools::wsdb::field_instance_t& inst) {
return boost::get<T>(inst) == value;
};
}
在第一个 lambda 函数中,我被迫使用 ->bool
返回类型规范,而在第二个 lambda 中,编译器非常乐意推断返回类型。
我的问题是:编译器什么时候可以推断 lambda 的返回类型?只有当你只有一句简单的台词时才这样吗?
Consider the two lambda functions in the following VC++ 10.0 code:
template <typename T>
void eq(uint fieldno, T value) {
table* index_table = db.get_index_table(fieldno);
if (index_table == nullptr) return;
std::set<uint> recs;
index_table->scan_index<T>(value, [&](uint recno, T n)->bool {
if (n != value) return false;
recs.insert(recno);
return true;
});
add_scalar_hits(fieldno, recs).is_hit =
[=](tools::wsdb::field_instance_t& inst) {
return boost::get<T>(inst) == value;
};
}
In the first lambda function, I was forced to use the ->bool
return type specification whereas in the second lambda the compiler was perfectly happy to infer the return type.
My question is: when can the compiler infer the return type on a lambda? Is it only when you have a simple one-liner?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
“只有当你有一句简单的俏皮话时才这样吗?”
是的。根据最新的公开 C++0x 草案 (§5.1.2/4),
因此,您的第一个 lambda 表达式被解释为返回 < code>void,这是不对的,所以需要添加一个
->; bool
显式指定返回类型。"Is it only when you have a simple one-liner?"
Yes. According to the latest public C++0x draft (§5.1.2/4),
Therefore, your first lambda expression is interpreted as returning
void
, which is not right, so you need to add a-> bool
to explicitly specify the return type.