【问题标题】:reference or pointer notation with boost::ptr_vectorboost::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 对不起,如果消息是一个秃头指针,你正在做的事情很好,如果它是一个共享指针,通过引用捕获它会更有效。

标签: c++ pointers boost c++11


【解决方案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()。对不起,噪音。 :-]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多