Jar*_*d42 6 c++ pointers iterator stdvector language-lawyer
我已经听说std::vector<T>::iterator可以简单地T*代替迭代器类。
但这真的合法吗?
指针算术仅适用于数组,std::vector不创建数组对象 ( T[]) 而是创建连续对象(通过放置 new)。
此外,我认为std::launder甚至需要(C++17)来访问单个元素(正如我们可以在 的static_vector示例注释中阅读的那样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();
}
}
Run Code Online (Sandbox Code Playgroud)
std::vector::iterator是标准库的一部分,因此也是实现的一部分。这意味着它可能取决于特定于实现的细节。特别地,该实现可以以不可移植的方式使用指针算术。如果实现知道 aT[]与连续分配的不可区分T's,那么它可以对它们进行指针运算。