5

以下代码在我的系统上编译良好:

#include <array>
#include <type_traits>

static_assert(std::is_same<std::array<int, 5>::iterator,
                           std::array<int, 7>::iterator>::value, ":(");

标准是否保证了这种行为?迭代器类型是否与数组大小无关?

如果有保证,有没有办法从元素类型中抽象出来,忽略大小?

template<typename T, size_t n>
void foobar(std::array<T, n>::iterator it)

也就是说,有没有什么方法可以在不提及 size 的情况下编写上述特定于数组的代码n

请注意T*,即使在发布模式下迭代器可能是T*.

4

3 回答 3

4

不,没有任何保证。标准只是说

typedef implementation-defined    iterator;

迭代器类型可以是普通指针、属于 的类array或包装普通指针的单独类。

如果是成员类,则取决于数组大小。否则很可能不会。

于 2012-10-10T16:28:04.700 回答
3

不,不能保证。每个数组类型array<T, size_t>都有一个名为 typedef 的嵌套成员iterator,其类型是实现定义的。

于 2012-10-10T16:25:24.767 回答
1

简单的答案是让它更通用一点。为什么您只想允许来自 a 的迭代器std::array

template <typename Iterator>
void foobar( Iterator it )

在第二段代码中,类型T和大小n处于不可推断的上下文中。从概念上讲,多个std::array类型可以具有相同的iterator类型,或者正如您提到的那样,它可以只是T*,并且不可能找到可能std::array的 a T*asiterator

于 2012-10-10T16:27:55.343 回答