2010-11-04 28 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來顯式指定返回類型。