Я изучаю навязчивый список:
#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 специально требует lvalue.С логической точки зрения, почему навязчивый список не может справиться с rvalue?
Требует ли lvalue, что пользователь должен сам обрабатывать жизненный цикл DummyObject?Другими словами, когда IntrusiveList pop_front, всплывающий объект не будет уничтожен?
Кроме того, событие, которое я передаю по lvalue:
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>) [с 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 () '.