boost::ptr_vector 的引用或指针表示法
Posted
技术标签:
【中文标题】boost::ptr_vector 的引用或指针表示法【英文标题】:reference or pointer notation with boost::ptr_vector 【发布时间】:2011-12-20 08:48:03 【问题描述】://this returns a boost::ptr_vector<Ordre>
auto& vec = ptf.listeOrdre().liste();
auto it = std::find_if( vec.begin(), vec.end(),
[message](Ordre& ordre)return ordre.id() == message->id();
);
if( it == vec.end())
return;
Ordre& ordre = *it;
我对应该在 lambda 参数和最后一行代码上使用的“&”或“*”有疑问。
有人看错了吗?
我在生产中遇到了崩溃,我怀疑这段代码
谢谢
【问题讨论】:
您不应该通过引用将消息传递给 Lambda 吗? 如果 ptr_vector 返回指针而不是引用,它根本不会编译。 - 也许liste()
返回一个对局部变量的引用?
@mark:我不知道。为什么你认为我应该通过referenec 传递消息?
@visitor: 不,它是在堆上声明的类的字段
@Guillaume07 对不起,如果消息是一个秃头指针,你正在做的事情很好,如果它是一个共享指针,通过引用捕获它会更有效。
【参考方案1】:
最后一行看起来是正确的。
ptf.listeOrdre()
可能存在一个错误。如果它返回一个值,它将被复制。那么vec
将引用一个临时对象。
lambda 的参数应该是const&
,但我怀疑这是问题所在。
除此之外,这段sn-p代码没有任何问题。
【讨论】:
如果ptf.listeOrdre()
返回一个值,那么auto& vec = ptf.listeOrdre().liste();
将无法编译,因为将非常量左值引用绑定到临时对象是非法的。
@ildjarn。你很困惑。如果liste()
返回一个值,编译器会报错。但是您可以临时调用非常量函数。如果listOrdre()
返回一个值会发生什么。看这里:ideone.com/gpUNA
你说得对,我看错了。我的意思是,如果ptf.listeOrdre().liste()
按值返回,那么auto& vec = ptf.listeOrdre().liste();
将无法编译;但当然,你说的是ptf.listeOrdre()
,而不是ptf.listeOrdre().liste()
。对不起,噪音。 :-]以上是关于boost::ptr_vector 的引用或指针表示法的主要内容,如果未能解决你的问题,请参考以下文章
boost::ptr_vector 和 boost::any 的问题