TAG

首都機能移轉 (2) 歌詞 (2) 靠北文 (40) 戲言 (30) 糟糕 (7) ACG (23) Assembly (2) Boost (2) C (31) C++ (69) CMake (4) CSIE (67) Debian (34) Design_Pattern (2) Django (1) Eclipse (1) en_US (13) FFmpeg (3) FoolproofProject (26) FreeBSD (2) Git (4) GNU_Linux (65) IDE (5) Java (11) JavaScript (19) KDE (15) Khopper (16) KomiX (3) Kubuntu (18) Life (1) Lighttpd (2) Mac_OS_X (2) Opera (1) PHP (2) PicKing (2) Programing (21) Prolog (1) Python (7) QSnapshot (2) Qt (30) Qt_Jambi (1) Regular_Expression (1) Shell_Script (7) Talk (98) VirtualBox (7) Visual_Studio (13) Windows (18) zh_TW (36)

2011年2月2日 星期三

Lambda binding issue in VC10

VC10 的 lambda expression 的 bug 還真多 ... 這應該是我第三次踩到相關的 bug 了吧。
auto f( std::bind( []( int a, int b )->int {
    return a + b;
}, std::placeholders::_1, 2 ) );

f( 1 ); // returns 3
以上的範例定義一個接受二個 int 的 lambda expression, 回傳相加後的值,並把第二個參數綁定為 2,因此可以視為一個只接受一個 int 的函式,回傳和 2 相加的結果。
在 GCC 4.5 是沒問題的,但 VC10 就不行。因為 lambda expression 是 C++0x 的規格,在型別推導時應使用 decltype 來推導,但 VC10 的實作依然使用 C++03 TR1 時代的 trait 協定,因此會出錯。
上例中若使用一般的函式指標或函式物件就不會有問題。
最後我是在 lambda expression 外包一個 std::function 再傳給 std::bind,讓 trait 去吃 std::function 的定義,就解決了。
auto f( std::bind( std::function< int( int, int ) >( []( int a, int b )->int {
    return a + b;
} ), std::placeholders::_1, 2 ) );
呃,重點是在 VC10 的 SP1 beta1 還沒修正。
Reference:

沒有留言:

張貼留言