C++ 为什么要增加侵入性列表';s push_back函数需要左值?

C++ 为什么要增加侵入性列表';s push_back函数需要左值?,c++,rvalue,lvalue,intrusive-containers,boost-intrusive,C++,Rvalue,Lvalue,Intrusive Containers,Boost Intrusive,我正在学习侵入列表: #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 Intr

我正在学习侵入列表:

#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;
}
二进制文件未能通过以下断言之一:


intrusivelist:/usr/include/boost/intrusive/detail/generic_hook.hpp:48:void boost::intrusive::detail::destructor_impl(hook&,boost::intrusive::detail::link_dispatch)[带hook=boost::intrusive::generic_hook]:断言`!hook.is_linked()'失败。

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

文件中指出了这一点:

  • 用户必须独立于容器管理插入对象的生存期
现在临时对象的生存时间比侵入式容器短,导致未定义的行为,侵入式容器不创建任何副本。因此,不希望使用r值

现在,您的示例的这个版本(无崩溃):

另一方面,这个版本:


我想在我的项目中使用侵入列表,因为我需要1。在不同的容器中放置一个物体;2.当我浏览列表时,缓存未命中的次数更少。如果我想实现这些目标,我应该使用对象池的入侵列表?这是入侵列表的常见用例吗?是的,这是入侵容器的良好用例。只要阅读有关侵入式容器的优缺点的文档(还有关于非侵入式容器的优缺点的部分),它涵盖了您列出的所有内容。
int main()
{

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

  return 0;
}
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;
}