代码之家  ›  专栏  ›  技术社区  ›  Ferruccio

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

  •  2
  • Ferruccio  · 技术社区  · 14 年前

    考虑下面的VC++ 10代码中的两个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的返回类型?只有当你有一个简单的一行吗?

    1 回复  |  直到 14 年前
        1
  •  5
  •   kennytm    14 年前

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

    如果 lambda表达式 不包括 ,就好像 尾随返回类型

    • 如果 复合语句 是这样的

      { return 属性说明符 表达 ; }

      左值到右值转换(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表达式被解释为返回 ,这不正确,因此需要添加 -> bool