占位符可以与ref()一起使用

my_*_*ion 3 c++ c++11

我正在使用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)

看起来像占位符不带参考,但只是想确认,你能列出语义定义为什么它没有?它实际上是通过引用传递的吗?

rod*_*igo 6

std::ref() 用于通过引用传递值,否则将作为副本传递.

在您的代码中,它用于传递os一个显然您不想复制的本地名称.

请记住,std::bind()复制是调用它.也就是说,返回的值std::bind()保存每个传递的对象的副本.std::ref()防止该副本并保留引用.

但占位符实际上并不是返回的对象内的值std::bind().相反,它们是一个标记,指示函数将第n个参数转发给包装函数.这里的关键词是forward:因为值被转发,如果你的函数需要引用,它将作为引用传递,如果你的函数需要复制,它将作为副本传递.

因为_1它不是传递给函数的实际值,而是一个库技巧来从应该采用该值的位置发出信号,因此使用std::ref()它是没有意义的.