我正在使用c ++ 11功能,只是尝试了以下代码:
void dump(ostream &os, const MyType &mt)
{
}
void f(const vector<MyType> &mts, ostream &os)
{
for_each(mts.begin(), mts.end(), bind(dump, ref(os), ref(_1));
}
Run Code Online (Sandbox Code Playgroud)
这段代码在clang编译错误:
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_algo.h:4417:2: error: no matching function for call to object of type
'std::_Bind<void (*(std::reference_wrapper<std::basic_ostream<char> >, std::reference_wrapper<const std::_Placeholder<1> >))(std::basic_ostream<char>
&, const MyType &)>'
__f(*__first);
Run Code Online (Sandbox Code Playgroud)
如果我剥ref离_1,其精编:
for_each(mts.begin(), mts.end(), bind(dump, ref(os), _1);
Run Code Online (Sandbox Code Playgroud)
看起来像占位符不带参考,但只是想确认,你能列出语义定义为什么它没有?它实际上是通过引用传递的吗?
std::ref() 用于通过引用传递值,否则将作为副本传递.
在您的代码中,它用于传递os一个显然您不想复制的本地名称.
请记住,std::bind()复制是调用它.也就是说,返回的值std::bind()保存每个传递的对象的副本.std::ref()防止该副本并保留引用.
但占位符实际上并不是返回的对象内的值std::bind().相反,它们是一个标记,指示函数将第n个参数转发给包装函数.这里的关键词是forward:因为值被转发,如果你的函数需要引用,它将作为引用传递,如果你的函数需要复制,它将作为副本传递.
因为_1它不是传递给函数的实际值,而是一个库技巧来从应该采用该值的位置发出信号,因此使用std::ref()它是没有意义的.