为什么迭代器类型与矢量容器中的 value_type * 不匹配
Why iterator type is mismatched with value_type * in vector container?
根据最新的STL源代码,我可以在stl_vector.h中找到以下内容
template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >
class vector : protected _Vector_base<_Tp, _Alloc>
{
private:
typedef _Vector_base<_Tp, _Alloc> _Base;
public:
typedef _Tp value_type;
typedef value_type* pointer;
typedef const value_type* const_pointer;
typedef value_type* iterator;
typedef const value_type* const_iterator;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
...
int main() {
vector<string>::iterator it;
cout << "iterator type check 1 " << (typeid(it) == typeid(string *)) << endl;
cout << "iterator type check 2" << (typeid(vector<string>::iterator) == typeid(vector<string>::value_type *)) << endl;
cout << "iterator type check 3" << (typeid(vector<string>::pointer) == typeid(vector<string>::value_type *)) << endl;
cout << "iterator type check 4" << (typeid(string *) == typeid(vector<string>::value_type *)) << endl;
}
但是,当我使用 clang++ 编译上面的 main 时,我得到了迭代器和 value_type * 的不匹配结果。结果是 1/2 不匹配,3/4 匹配。但是,我预计 1/2 也应该匹配。这是因为我指的是最新的 stl 代码吗?
STL 不是C++标准库。C++ 标准允许实现将指针用于随机访问迭代器,但不强制要求它。clang 和 gcc 都为这些迭代器使用用户定义的类型,而不是指针。海湾合作委员会也不是。
您需要查看实际尝试编译的代码的实现。那不是STL。
例如,在 gcc 4.8 上std::vector::iterator
typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
其中__normal_iterator
是类模板。
相关文章:
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 为什么static_assert错误:即使我传递常量"expression must have a constant value"?
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 控制到达非空函数clang(-Wreturn-type)的末尾
- 为什么我会" void value not ignored as it ought to be"?
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 方法错误"not all control paths return a value"和方法不返回值
- 将系数存储在头文件的数组中("does not name a type"错误)
- 尝试打开 ifstream 时出现"Incomplete type"错误
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在"结构提升::enable_if<提升::is_pod<T>,无效>"中没有名为"type"的类型
- 如何修复" State Error (active) E0513 a value of type "const wchar_t *" cannot be assigned to an entity o
- "a value of type " void (exeCallback::*)(int) " cannot be assigned to an entity of type " void (*)(
- cmake -D <var>:<type>=<value> 参数"-D"是什么意思
- 没有用于初始化'value type'的匹配构造函数
- new(size, value) Type[0]返回的指针是否合法,是否可以用来构建数组?