C++;0x lambda返回值类型推断规则

C++;0x lambda返回值类型推断规则,lambda,c++11,type-inference,Lambda,C++11,Type Inference,考虑以下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&

考虑以下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;
        };
}
模板
无效均衡器(uint字段号,T值){
table*index_table=db.get_index_table(fieldno);
if(index_table==nullptr)返回;
std::设置REC;
索引表->扫描索引(值[&](uint recno,tn)->bool{
如果(n!=值)返回false;
记录插入(记录编号);
返回true;
});
添加标量命中率(字段号,记录)。是否命中=
[=](工具::wsdb::字段\u实例\u t&inst){
返回boost::get(inst)=值;
};
}
在第一个lambda函数中,我被迫使用
->bool
返回类型规范,而在第二个lambda函数中,编译器非常乐意推断返回类型

我的问题是:编译器何时可以推断lambda上的返回类型?只有当你有一个简单的单行程序时,它才会出现吗?

“只有当你有一个简单的单行程序时,它才会出现吗?”

对。根据最新的公共C++0x草案(§5.1.2/4)

如果lambda表达式不包含尾随返回类型,就好像尾随返回类型表示以下类型:

  • 如果复合语句的形式为

    {return
    属性说明符opt表达式
    ;}

    左值到右值转换(4.1)、数组到指针转换(4.2)和函数到指针转换(4.3)后返回表达式的类型

  • 否则,
    无效

[示例:

-[结束示例]

因此,您的第一个lambda表达式被解释为返回
void
,这是不正确的,因此您需要添加
->bool
,以明确指定返回类型

 auto x1 = [](int i){ return i; }; // OK: return type is int
 auto x2 = []{ return { 1, 2 }; }; // error: the return type is void (a
                                   // braced-init-list is not an expression)