提问者:小点点

std::vector::iterator可以合法地作为指针吗


我已经听说std::vector::iterator可以简单地成为T*,而不是一个迭代器类。

但这真的合法吗?

指针算术仅适用于数组,std::vector不创建数组对象(T[]),而是创建连续对象(通过新位置)。

此外,我认为访问单个元素甚至需要std::launder(正如我们可以在std::aligned_storage示例的注释中读到的那样)。

我认为大致相当于跟随,我认为是未定义的行为。

template <typename T, std::size_t N, typename F>
void test_array(F func)
    typename std::aligned_storage<sizeof (T) * N, alignof (T)>::type data;
    char* buffer = &data;
    for (std::size_t i = 0; i != N; ++i) {
        new (buffer + i * sizeof(T)) T;
    }
    T* array = reinterpret_cast<T*>(buffer);
    for (std::size_t i = 0; i != N; ++i) {
        func(array[i]); // UB for (0 < i) ?
    }
    for (std::size_t i = 0; i != N; ++i) {
        array[i].~T();
    }
}

共1个答案

匿名用户

Std::Vector::Iterator是标准库的一部分,因此也是实现的一部分。 这意味着它可能取决于特定于实现的细节。 具体地说,该实现可以以不可移植的方式使用指针算术。 如果实现知道T[]与连续分配的T的无法区分,那么它可以对它们进行指针运算。