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 協定,因此會出錯。
上例中若使用一般的函式指標或函式物件就不會有問題。
在 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:
沒有留言:
張貼留言