首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么不推荐使用std::iterator?

为什么不推荐使用std::iterator?
EN

Stack Overflow用户
提问于 2017-04-07 09:16:47
回答 2查看 9.3K关注 0票数 45

模板类std::iterator在C++17中被设置为不推荐使用。为什么?这是一种确保std::iterator_traits正常工作的便捷方法,特别是在您可以使用默认模板参数的情况下。在C++17中有没有其他方法可以做到这一点?

EN

Stack Overflow用户

回答已采纳

发布于 2017-04-07 09:34:40

来自the proposal that suggested its deprecation

作为编写迭代器类的辅助工具,最初的标准库提供了迭代器类模板,以自动声明iterator_traits期望的每个迭代器所需的五个类型定义。然后在库本身中使用,例如在std::ostream_iterator的规范中:

模板<类T,类charT = char,类特征= char_traits >类ostream_iterator:公共iterator;

对于读者来说,与在类定义本身中简单地提供预期的typedefs相比,void参数的长序列要清楚得多,这是当前工作草案采用的方法,遵循C++14中设置的模式,我们不赞成在整个unary_functionbinary_function函数库中使用派生。

除了清晰度降低之外,迭代器模板还为粗心大意的人设置了陷阱,因为在典型的用法中,它将是一个依赖的基类,这意味着在从类或其成员函数中查找名称时不会对其进行检查。这导致惊讶的用户试图理解为什么以下简单的用法不起作用:

#include template struct MyIterator : std::iterator { value_type data;//错误:通过名称查找找不到value_type // ...省略了实现细节... };

单单清晰的原因就足以说服LWG更新标准库规范,不再强制要求标准迭代器适配器派生自std::iterator,因此在标准本身中不再进一步使用此模板。因此,它看起来很有可能被弃用。

您还可以在LWG 2438中看到STL的推理。(h/t T.C.)

至于另一种方式,并不是真的。您基本上可以实现自己版本的std::iterator (这并不太难),或者手动编写所有这些类型定义(这也不是太难,为了清楚起见,我实际上更喜欢它)。

票数 28
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43268146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档