2017-04-07 236 views
18

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

+1

是的,在C++ 17中做同样的事情有一个方便的方法:你只是做同样的事情。 “已弃用”意味着只有**,它**可能会在未来消失。这并不意味着你不能使用它,或者它不会像往常一样做。 –

+0

@PeteBecker:但问题是,如果它被弃用,那么为什么程序员会在下一个版本左右的时候使用它?为什么它开始使用,如果它非常方便? – Nawaz

+0

@Nawaz - 这个问题倒退了。如果它在标准中,为什么不使用它? **标准中的任何**可能会在未来消失。是的,不赞成使用的东西可能会消失,或者可能不会;考虑一下C头文件,这些头文件在C++中不推荐使用,但实际上,它们永远不会消失。 –

回答

16

the proposal that suggested its deprecation

为帮助编写迭代器类,原来的标准库提供的迭代器类模板自动五大类型定义预计iterator_traits每个迭代的声明。然后将其在库本身使用,例如在std::ostream_iterator规格:

template <class T, class charT = char, class traits = char_traits<charT> > 
class ostream_iterator: 
    public iterator<output_iterator_tag, void, void, void, void>; 

void参数的长序列是少得多清楚地向读者不是简单的类定义本身,提供预期的typedef这是当前工作草案采用的方法,遵循C++ 14中设置的模式,其中我们不推荐遍及函数库unary_functionbinary_function的推导。

除了清晰度降低之外,迭代器模板还为粗心大意设置了一个陷阱,就像在典型的用法中它将是一个依赖的基类一样,这意味着它不会在类内进行名称查找期间查找或其成员职能。这导致吃惊用户试图理解为什么下面简单的用法不工作:

#include <iterator> 

template <typename T> 
struct MyIterator : std::iterator<std::random_access_iterator_tag, T> { 
    value_type data; // Error: value_type is not found by name lookup 

    // ... implementations details elided ... 
}; 

单独清晰的理由足以说服LWG到标准库规范更新不再授权标准的迭代器adapators为来自std::iterator,所以在标准本身内不再使用该模板。因此,它看起来像是一个强大的弃用对象。

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


至于其他一些做法,并不是真的。你基本上可以实现你自己的版本std::iterator(这不是太难)或手动写出所有这些typedef(这也不是太困难,而我实际上更喜欢它)。

+2

STL在[LWG 2438](https://timsong-cpp.github.io/lwg-issues/2438)中的论点似乎也很合理:该名称可能误导用户(特别是来自* ahem *某些其他编程语言)认为派生是强制性的,或者写一个接受'std :: iterator'的函数是有意义的。 –

相关问题