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