具有可访问构造函数的 std::vector< T >::iterator

Posted

技术标签:

【中文标题】具有可访问构造函数的 std::vector< T >::iterator【英文标题】:std::vector< T >::iterator with accessible constructor 【发布时间】:2016-12-17 14:29:45 【问题描述】: STL

g++ 实现允许我在我的客户端代码中构造一个具有任意地址值的 std::vector&lt;T&gt;::iterator 类型的迭代器:

int* i_ptr;
std::vector< int >::iterator it(i_ptr);

是标准能力,还是只是初步实现?

它的设计用途是什么?

【问题讨论】:

该标准并未将其定义为必需功能。事实上,这样的结构应该是私有的,只能从std::vector 访问,通过friendship。该标准甚至不否认这种情况的发生(所以 - 可能 - 我们无法维持它是一个缺陷,但可能有人可以报告它) 【参考方案1】:

这只是一个实现细节,甚至不能保证按标准编译。它也没有在 gcc 的实现定义的行为中列出,也没有在 GNU C++ 扩展中列出,因此您的 sn-p 可能会在任何版本更改时中断。

在你的代码中不要依赖这种“工作”。

【讨论】:

顺便说一句,标准中对容器迭代器的要求在哪里描述? @GreenTree 第 23 章 C++14 标准或 cppreference.com 前者更正式,后者在日常使用中更有用。 作为一个评论,iirc Chandler Carruth 曾经说过 libc++ 保证 std::vector&lt;T&gt;::iteratorT* for T!=bool 作为实现定义的行为,但我找不到任何文档。【参考方案2】:

在 Visual Studio 2017 RC 中,这无法编译:

main.cpp(8): error C2664: 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>::
_Vector_iterator(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>> &&)':
cannot convert argument 1 from 'int *' to
'const std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>> &'

【讨论】:

看起来像是评论,而不是答案) 另外,您至少应该指定您是处于调试模式还是发布模式,因为结果可能会有所不同。 我会说没关系。这不是language-lawyer,因此不编译代码的主要现代平台表明 sn-p 不是可移植的标准 C++ 就好了。【参考方案3】:

我不认为这是一个标准能力。只是实现定义的功能。

在许多实现中,vector 迭代器只是简单的指针。所以如果你有一个vector,那么迭代器就是一个指向T类型的指针。这样做是为了一些优化目的。

在这样的实现中,可以创建从指向 T 类型的指针初始化的迭代器,因为您可以通过另一个此类类型的指针来初始化指向 T 类型的指针。

但它是实现定义的,当然,如果迭代器定义为指向类型T的指针。

【讨论】:

以上是关于具有可访问构造函数的 std::vector< T >::iterator的主要内容,如果未能解决你的问题,请参考以下文章

MSVC 2015 为 std::vector 选择不正确的构造函数重载

如何访问 std::vector 类型的成员

为啥 C++11 会从 std::vector 填充构造函数的原型中移除默认值?

在类构造函数中设置 std::vector

如果类具有与类同名的成员,则生成构造函数

使用 std::vector 时如何将索引信息传递给元素构造函数?