簡體   English   中英

為什么 boost intrusive list 的 push_back function 需要左值?

[英]Why boost intrusive list 's push_back function requires lvalue?

我正在學習侵入性列表:

#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 需要專門的左值。 從邏輯的角度來看,為什么侵入式列表無法處理右值?

左值要求是否意味着用戶需要自己處理 DummyObject 的生命周期? 也就是說,當 IntrusiveList pop_front 時,彈出的 object 會不會被破壞?

另外,我通過左值傳遞的事件:

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()' 失敗。

這是一個簡單的侵入式容器,不執行 memory 管理。 您有責任確保存儲的 object 比侵入式容器的壽命更長。

這是在文檔中指出的:

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

  • 用戶必須獨立於容器管理插入對象的生命周期

現在臨時 object 將比侵入式容器更短,導致未定義的行為,侵入式容器不會創建任何副本。 因此不需要使用 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;
}

即使在使用 lvalue 時,我在使用侵入式列表時也遇到了相同的斷言失敗。如果列表在銷毀時不為空,則會發生斷言失敗。 如果在調用列表析構函數之前 pop() 所有值,應該沒問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM