2013-10-10 135 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