0

我正在学习侵入性列表:

#include <iostream>
#include <list>
#include <boost/intrusive/list.hpp>


struct DummyObject : public boost::intrusive::list_base_hook<>{
  double price;

  DummyObject(const double a): price(a){

  }
};

using IntrusiveListContainer = boost::intrusive::list<DummyObject>;
using NonintrusiveListContainer = std::list<DummyObject>;

int main()
{

  IntrusiveListContainer  intrusivecontainer;
  NonintrusiveListContainer  nonintrusivecontainer;

  intrusivecontainer.push_back(DummyObject (22.2)); // ERROR
  nonintrusivecontainer.push_back(DummyObject (22.2));// compiled

  return 0;
}

我了解侵入式列表的基本思想,但我不明白为什么 push_back 需要专门的左值。从逻辑的角度来看,为什么侵入式列表无法处理 rvalue ?

左值要求是否意味着用户需要自己处理 DummyObject 的生命周期?也就是说,当 IntrusiveList pop_front 时,弹出的对象不会被破坏?

另外,我通过左值传递的事件:

int main()
{

  IntrusiveListContainer  intrusivecontainer;
  NonintrusiveListContainer  nonintrusivecontainer;
  DummyObject a(22.2);
  intrusivecontainer.push_front(a); // compiled
  //nonintrusivecontainer.push_back(DummyObject (22.2));// compiled

  return 0;
}

二进制文件中的一个断言失败:

intrusivelist: /usr/include/boost/intrusive/detail/generic_hook.hpp:48: void boost::intrusive::detail::destructor_impl(Hook&, boost::intrusive::detail::link_dispatch<(boost::intrusive: :link_mode_type)1>) [with Hook = boost::intrusive::generic_hook<(boost::intrusive::algo_types)0, boost::intrusive::list_node_traits, boost::intrusive::dft_tag, (boost::intrusive ::link_mode_type)1, (boost::intrusive::base_hook_type)1>]: 断言 `!hook.is_linked()' 失败。

4

1 回答 1

1

这是一个简单的侵入式容器,不执行内存管理。您有责任确保存储的对象比侵入式容器更有效。

这是在文档中指出的:

侵入式和非侵入式容器 - 1.64.0

  • 用户必须独立于容器管理插入对象的生命周期。

现在临时对象的寿命会比侵入式容器更短,导致未定义的行为,侵入式容器不会创建任何副本。因此不需要使用 r 值。

现在这个版本的例子工作正常(没有崩溃):

int main()
{
  DummyObject a(22.2);
  IntrusiveListContainer  intrusivecontainer;
  NonintrusiveListContainer  nonintrusivecontainer;

  intrusivecontainer.push_back(a); // ERROR
  nonintrusivecontainer.push_back(a);// compiled

  return 0;
}

另一方面,这个版本以断言失败结束

int main()
{
  IntrusiveListContainer  intrusivecontainer;
  NonintrusiveListContainer  nonintrusivecontainer;
  DummyObject a(22.2);

  intrusivecontainer.push_back(a); // ERROR
  nonintrusivecontainer.push_back(a);// compiled

  return 0;
}
于 2019-09-23T17:16:56.683 回答