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

C++ 占位符可以与ref()一起使用吗,c++,c++11,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)); } 占位符似乎与引用不符,但想确认一下,你能列出语义定义吗?为什么不?它实际上已经通

我正在使用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));
}
占位符似乎与引用不符,但想确认一下,你能列出语义定义吗?为什么不?它实际上已经通过引用传递了吗?

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

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

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

但是占位符实际上不是
std::bind()
返回的对象中的值。相反,它们是指示函数将第n个参数转发给包装函数的标记。这里的关键词是forward:因为值是转发的,所以如果函数获取引用,它将作为引用传递,如果函数获取副本,它将作为副本传递


由于
\u 1
不是要传递给函数的实际值,而是一个库技巧,用于向应该从何处获取该值发出信号,因此使用
std::ref()
没有任何意义。

根据我的经验,您的原始代码没有意义,或者某件事情太简单以至于
bind
不相关(这里的情况),或者它太复杂了,使
bind
工作太多了。使用基于范围的循环,只需调用函数。@cheers-sandhth.-Alf:并且不要忘记lambdas:
(mts.begin(),mts.end(),[&os](const MyType&x){dump(os,x);})
@LightnessRacesinOrbit:在我看来,OP担心
dump()
mt
参数是否是容器中对象的引用,或者它们是否是隐藏副本。使用
ref(_1)
是为了避免此类副本。我的回答是,没有占位符对象的隐藏副本。Re“因为_1不是一个真正的值”,措辞可以改进,因为这些占位符不是一个核心语言特性:它们是一个库解决方案,因此非常真实。只是
bind
专门处理相应的类型。在
std::ref
的结果中,该机器看不到它。@cheers-sandhth.-Alf:当然
\u 1
是一个值。只是它不是传递给
dump()
的值,这就是我用real这个词的意思。我已经改写了描述,希望现在更清楚。
/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);
for_each(mts.begin(), mts.end(), bind(dump, ref(os), _1);