具有可访问构造函数的 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<T>::iterator
类型的迭代器:
int* i_ptr;
std::vector< int >::iterator it(i_ptr);
是标准能力,还是只是初步实现?
它的设计用途是什么?
【问题讨论】:
该标准并未将其定义为必需功能。事实上,这样的结构应该是私有的,只能从std::vector
访问,通过friend
ship。该标准甚至不否认这种情况的发生(所以 - 可能 - 我们无法维持它是一个缺陷,但可能有人可以报告它)
【参考方案1】:
这只是一个实现细节,甚至不能保证按标准编译。它也没有在 gcc 的实现定义的行为中列出,也没有在 GNU C++ 扩展中列出,因此您的 sn-p 可能会在任何版本更改时中断。
在你的代码中不要依赖这种“工作”。
【讨论】:
顺便说一句,标准中对容器迭代器的要求在哪里描述? @GreenTree 第 23 章 C++14 标准或 cppreference.com 前者更正式,后者在日常使用中更有用。 作为一个评论,iirc Chandler Carruth 曾经说过 libc++ 保证std::vector<T>::iterator
是 T*
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 选择不正确的构造函数重载