在 cppreference.com 中 std::uninitialised_fill()
的实现和后续示例中,我在理解一些事情时遇到了一些困难:
template<class ForwardIt, class T>
void uninitialized_fill(ForwardIt first, ForwardIt last, const T& value)
{
typedef typename std::iterator_traits<ForwardIt>::value_type Value;
ForwardIt current = first;
try {
for (; current != last; ++current) {
::new (static_cast<void*>(&*current)) Value(value);
}
....
}
我不明白为什么在 static_cast
中我需要做 (&*)
?
Stroustrup 在他的书中指出“奇怪的构造 (&*) 负责处理不是指针的迭代器。在那种情况下,我们需要获取通过取消引用获得的元素的地址来获取指针”。
我有三个问题
- “不是指针的迭代器”是什么意思?除了指针的泛化之外,它们还能是什么?更令人困惑的是,我们需要将解引用获得的元素的地址获取指针。
- 在语法上
::new
和new
是一样的。使用::
有特殊原因吗? get_temporary_buffer(
) 在概念上是否与MyClass * p3 = (MyClass*)::operator new (sizeof(MyClass));
分配存储空间相同?两个不同的东西?
能否为所有问题提供一个小示例?
最佳答案
我不确定这是否是您的意思,但您的观点确实有道理。
可以说,一个容器只包含已初始化的对象,因此如果您正在初始化一个未初始化的缓冲区,该缓冲区几乎肯定是一个您将使用原始指针的数组。
尽管如此,创建指向不是数组的未初始化缓冲区的迭代器是微不足道的,所以我想这是为了处理这种情况。
关于c++ - std::uninitialized_fill() 和 std::get_temporary_buffer(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25184365/