2010-11-04 30 views
2

考虑两个lambda函数在下面的VC++ 10.0代码:的C++ 0x拉姆达返回值类型推理规则

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的返回类型?只有当你有一个简单的单线程?

回答

5

“只有当你有一个简单的单线程?”

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

如果λ-表达不包括尾返回型,这是因为如果该后返回型表示以下类型:

  • 如果化合物语句的形式为

    { 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) 

- 端示例]

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