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&amp;,但我怀疑这是问题所在。

除此之外,这段sn-p代码没有任何问题。

【讨论】:

如果ptf.listeOrdre() 返回一个值,那么auto&amp; vec = ptf.listeOrdre().liste(); 将无法编译,因为将非常量左值引用绑定到临时对象是非法的。 @ildjarn。你很困惑。如果liste() 返回一个值,编译器会报错。但是您可以临时调用非常量函数。如果listOrdre() 返回一个值会发生什么。看这里:ideone.com/gpUNA 你说得对,我看错了。我的意思是,如果ptf.listeOrdre().liste() 按值返回,那么auto&amp; vec = ptf.listeOrdre().liste(); 将无法编译;但当然,你说的是ptf.listeOrdre(),而不是ptf.listeOrdre().liste()。对不起,噪音。 :-]

以上是关于boost::ptr_vector 的引用或指针表示法的主要内容,如果未能解决你的问题,请参考以下文章

boost::ptr_vector 和 boost::any 的问题

boost::ptr_vector 如何深拷贝底层对象?

boost::ptr_vector 与 std::vector<std::unique_ptr<T>>? [关闭]

“运行时错误:无效的内存地址或无指针取消引用”创建表

数据结构&算法07-链表技巧&参考源码

数据结构与算法-线性表之静态链表