gpt4 book ai didi

c++ - std::vector::iterator 是否可以合法地成为指针

转载 作者:行者123 更新时间:2023-12-01 13:05:37 25 4
gpt4 key购买 nike

我已经听说std::vector<T>::iterator可以简单地是 T*而不是迭代器类。
但这真的合法吗?
Pointer arithmetic仅适用于数组和 std::vector不创建数组对象( T[] )而是连续的对象(通过放置新)。
而且我认为 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();
}
}

最佳答案

std::vector::iterator是标准库的一部分,因此也是实现的一部分。这意味着它可能取决于特定于实现的细节。特别地,该实现可以以不可移植的方式使用指针算术。如果实现知道 T[]与连续分配的 T's 没有区别,然后它可以对它们进行指针运算。

关于c++ - std::vector::iterator 是否可以合法地成为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62815089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com