我尝试使用boost :: lockfree:queue来排队迭代器,但是static_assert上的编译失败了(仅限调试模式)
升压:: has_trivial_destructor ::值
和
升压:: has_trivial_assign ::值
代码:
using list_it_t = typename std::list<Elem<T, dimens>>::iterator;
[...]
boost::lockfree::queue<list_it_t> iterators(1024);
其中Elem是POD类型,但是afaik行为也可以与其他迭代器一起重现。
我一直认为迭代器满足两个条件?!它们以何种方式不能轻易转让或破坏?
我可以以某种方式仍然使用迭代器或者我必须更改到元素的指针吗?我正在迭代列表并推送队列上的迭代器以供其他线程处理。
规格:
答案 0 :(得分:2)
std::list::iterator
的唯一要求是它必须是BidirectionalIterator。所以是的,标准库实现可以选择具有非平凡的构造函数,析构函数,赋值运算符......
人们只能假设实现选择定义这样的特殊函数来提供调试检查或信息。
如果你看一下example implementation of std::list
,你会发现#122行
00110 template<typename _Tp>
00111 struct _List_iterator
00112 {
00113 typedef _List_iterator<_Tp> _Self;
00114 typedef _List_node<_Tp> _Node;
00115
00116 typedef ptrdiff_t difference_type;
00117 typedef bidirectional_iterator_tag iterator_category;
00118 typedef _Tp value_type;
00119 typedef _Tp* pointer;
00120 typedef _Tp& reference;
00121
00122 _List_iterator()
00123 : _M_node() { }
00124
00125 _List_iterator(_List_node_base* __x)
00126 : _M_node(__x) { }
...
00175 // The only member points to the %list element.
00176 _List_node_base* _M_node;
00177 };
...用户提供的构造函数,我猜想会提供更好的失败。