【问题标题】:Iterators and trivial assignment/destructor迭代器和简单的赋值/析构函数
【发布时间】:2018-06-05 08:44:30
【问题描述】:

我尝试使用 boost::lockfree:queue 对迭代器进行排队,但在 static_assert 上编译失败(仅限调试模式)

boost::has_trivial_destructor::value

boost::has_trivial_assign::value

代码:

using list_it_t = typename std::list<Elem<T, dimens>>::iterator;
[...]
boost::lockfree::queue<list_it_t> iterators(1024);

其中 Elem 是一种 POD 类型,但是该行为也可以通过其他迭代器重现。

我一直认为迭代器同时满足这两个条件?!它们在哪些方面是不可分配或不可破坏的?

我能否以某种方式仍然使用迭代器,或者我是否必须更改为元素上的指针?我正在遍历列表并将迭代器推送到队列中以供其他线程处理。

规格:

  • MSVC v141
  • 提升 1.65

【问题讨论】:

    标签: c++ c++11 boost


    【解决方案1】:

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

    ...我猜是一个用户提供的构造函数,可以提供更好的失败。

    【讨论】:

    • 你有什么方法可以绕过断言失败吗?我仍然不相信迭代器会破坏队列的完整性,并且迭代器的分配/销毁似乎正在工作。更改为 Elem* 需要修改代码,我更喜欢迭代器而不是原始指针。
    猜你喜欢
    • 1970-01-01
    • 2015-01-04
    • 2017-06-17
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2015-03-03
    相关资源
    最近更新 更多