是标准容器DefaultConstructable的迭代器
Are iterators of standard containers DefaultConstructible?
这是正规的吗?
int main() {
std::deque< int >::iterator x; // Or any container.
}
奖励问题:
auto y = x;
可能会复制未初始化的状态,该怎么办- 那么
… x = {};
需要一个非显式的默认构造函数呢 - 如果两者都是值初始化的(而不是如图所示的默认初始化),那么
x == y
呢
取决于您正在检查的迭代器概念。
如果它是一个正则Iterator
,它只是被称为迭代器的绝对最小值,那么答案是否定的,因为它只需要满足CopyConstructable、CopyAssignable和Destrucable的可构造性要求。(§24.2.2/2)
然而,大多数容器迭代器都满足双向迭代器的要求(除了std::forward_list
,它是一个异常)。所有BidirectionalIterator反过来也满足ForwardIterator的要求,这满足了InputIterator(相当麻烦)的要求。
ForwardIterator的要求明确说明:
类或指针类型X满足前锋的要求迭代器如果
--X满足输入迭代器的要求(24.2.3),
--X满足默认可施工要求(17.6.3.1),
N3376 中的§24.2.5/1
所以,是的,这是一个有效的假设。
您可以在§24.2中找到迭代器需求,但它们在cppreference
是的,但并不像最初看起来那么明显。
如果您查看§24.2.2[i迭代器.iterators](n3485),则Iterator
(通常)不需要是DefaultConstructible
。此外,看看§24.2.3[input.iterators]和$224.2.4[output.iterators],InputIterator
和OutputIterator
都不是。
一旦我们到达§24.2.5[转发迭代器]:
1/A类或指针类型X满足前向迭代器的要求,如果
- X满足输入迭代器(24.2.3)的要求
- X满足默认可施工要求(17.6.3.1)[…]
由于所有标准容器都有满足ForwardIterator
概念的迭代器,所以它们都有默认的可构造迭代器。
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 为什么 C++ std::unordered_map 从 emplace/ 找到返回一个迭代器?