2013-10-10 205 views
3

我發現了一個簡單的代碼:「cout <<(_ 1 * 3)」是什麼意思?

using namespace boost::lambda; 
typedef std::istream_iterator<int> in; 
std::for_each(
    in(std::cin), in(), std::cout << (_1 * 3) << " "); 

,我發現_1用於表示每個輸入整數,但如何做到這一點_1工作?有誰知道?

PS: 此代碼來自BOOST的第一個示例。當我運行該文件時,我發現for_each永遠不會終止,並且在每次「返回」單擊之後它都會保留讀取的數字。任何想法爲什麼會發生?

回答

4

這看起來像一個placeholder(也看this SO question)

std::placeholders命名空間包含佔位符對象[_1, . . . _N]其中N是一個實現定義的最大數目

當作爲參數使用。在std::bind表達式中,佔位符對象存儲在生成的函數對象中,並且在使用未綁定參數調用該函數對象時,每個佔位符_N被替換爲相應的第N個未綁定參數。

類型的佔位符對象是DefaultConstructibleCopyConstructible,其默認複製/移動構造函數不拋出異常,並且對於任何佔位符_N,類型std::is_placeholder<decltype(_N)>定義,並從std::integral_constant<int, N>的。

+0

這不是標準的庫佔位符。此佔位符被Boost.Lambda用於在將它們添加到C++ 11中的語言之前創建lambda表達式。 – Simple

+0

@簡單,真實,但我不知道OP在使用boost時正在回答:P另一個答案包含提升文檔的鏈接。 – SingerOfTheFall

4

Lambda將每個數字乘以三。從stdin讀取後。 in應該是一個迭代器 - 請粘貼完整的代碼。

_1是在另一個答案中解釋的佔位符。這個問題也應該被標記爲Boost。這是一個Boost.Lambda

Lambda expressions in details