2013-01-19 96 views
7

當用C++ 11個試驗新的功能,我發現,在std ::佔位符:: _ 1不能被直接用作lambda表達式:使用C++ 11佔位符作爲lambdas?

#include <algorithm> 
#include <functional> 
// #include <boost/lambda/lambda.hpp> 

using namespace std; 
// using boost::lambda::_1; 
using std::placeholders::_1; 

int main() 
{ 
    int a[] = {1,2,3,4,5}; 

    transform(a, a+5, a, _1 * 2); 
} 

鏘3.3錯誤:

tmp $ clang -std=c++11 -stdlib=libc++ -lc++ test.cpp 
test.cpp:16:27: error: invalid operands to binary expression ('__ph<1>' and 'int') 
    transform(a, a+5, a, _1 * 2); 

如果我改變它使用Boost的版本,它編譯好。

爲什麼這不符合標準版本?有沒有辦法讓它工作,或者我必須在這裏使用一個醜陋的lambda?

transform(a, a+5, a, [](int i){return i*2;}); 

回答

7

Boost實際上有一些_1佔位符。那些來自Boost.Bind(或多或少被納入C++ 11),來自Boost.Lambda,甚至來自Lambda的繼任者Boost.Phoenix的人。

Lambda和Phoenix版本僅限於佔位符可用於自行創建函子。 The Boost.Bind _1佔位符不能,而這就是標準化。 Lambda和Phoenix是將表達式轉換爲函數的方式;綁定只是一個函數綁定和參數調整系統。

+0

我明白了。用新的lambda系統實現相當於Boost:lambda/phoenix會很難/不好嗎? – ogoid

+0

@ogoid:嗯,*新的lambda系統是什麼?另外,你正在問一個完全不同的問題。 –

+0

@ogoid:對我來說,重新發明Boost.Lambda是相當困難的,儘管我不瞭解你。 – Mehrdad