c++ - 迭代器和简单的赋值/析构函数
问题描述
我尝试使用 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 类型,但 afaik 的行为也可以用其他迭代器重现。
我一直认为迭代器满足这两个条件?!它们以什么方式不能被分配或破坏?
我可以以某种方式仍然使用迭代器还是必须更改为元素上的指针?我正在迭代列表并将迭代器推送到队列中以由其他线程处理。
规格:
- MSVC v141
- 提升 1.65
解决方案
的唯一要求std::list::iterator
是它必须是BidirectionalIterator。所以是的,标准库实现可以选择具有非平凡的构造函数、析构函数、赋值运算符......
只能假设实现选择定义此类特殊功能以提供调试检查或信息。
如果您查看 的示例实现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 };
...我猜是一个用户提供的构造函数来提供更好的失败。
推荐阅读
- python - Flask从函数python中提取变量
- google-cloud-platform - 如何找到将数据从 Cloud Storage 流式传输到 BiqQuery 的实现代码?
- docker - 使用 Typescript、ReactRouter 和 nginx 作为反向代理 Dockerize React
- nestjs - NestJS 映射类型和 DTO 使用
- c++ - 使用堆栈和 DFS 遍历检测有向图中的循环
- c++ - 访问基类外部基类的私有嵌套类成员
- pdftron - pdftron Xamarin 表单中的 Annotationchanged 事件
- string - 使用字符串方法 .c_str() 将 Arduino C++ 字符串转换为 ANSI C 字符串(char* 数组)
- javascript - 仅使用纯 JS 在输入中获取可见文本?
- json - Flutter 将 json 响应加载到 List