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

时间:2010-11-04 14:39:30

标签: 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>(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的返回类型?只有当你有一个简单的单行时?

1 个答案:

答案 0 :(得分:5)

“只有当你有一个简单的单行时?”

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

  

如果 lambda-expression 不包含 trailing-return-type ,就好像 trailing-return-type 表示以下类型:

     
      
  • 如果复合语句的格式为

         

    { return attribute-specifier opt expression ; }

         

    lvalue-to-rvalue转换(4.1),数组到指针转换(4.2)和函数到指针转换(4.3)之后返回表达式的类型;

  •   
  • 否则,void

  •   
     

[示例:

 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)
     

- 结束示例]

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