【发布时间】:2016-11-24 17:52:51
【问题描述】:
我有这个代码:
#include <set>
int main() {
int array[] = { 0 };
std::set<int> stdset(&array[1], &array[1]);
}
获取最后一个数组元素之后的元素地址并将其转换为迭代器。基本上和std::vector::end()做的一样。
这样做是合法的:
std::vector<int> vec;
std::set<int> stdset(vec.end(), vec.end());
因为“最后一个”迭代器是一个非包含限制。
在第一个代码 sn-p 中对原始数组做同样的事情是否合法?
【问题讨论】:
-
标准容器范围构造函数是模板,不涉及转换。
-
旁白:
&array[0] + 1是合法的。更简单的array + 1也是如此。 -
这是个好问题。我根本不确定
&array[n]是否合法(而不是array + n或&array[0] + n,它们是合法的)。我认为它独立于迭代器:问题仅在于表达式&array[n]是否合法。 -> 这是问答:stackoverflow.com/questions/988158/… -
记录一下,您根本无法将指针转换为迭代器,因此title问题的答案显然是“否”。
标签: c++ arrays pointers iterator language-lawyer