在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在他的书中指出&#34;好奇的构造(&amp; *)负责处理非指针的迭代器。在这种情况下,我们需要获取通过取消引用获得的元素的地址来获得指针&#34;。
我有三个问题
::new
和new
是相同的。使用::
?get_temporary_buffer(
)在概念上分配存储与MyClass * p3 = (MyClass*) ::operator new (sizeof(MyClass));
相同,还是两个不同的东西? 请问您能为所有问题提供一些示例吗?
答案 0 :(得分:0)
我不确定这是不是你的意思,但你确实有一个有效的观点。
可以说,一个容器只包含初始化的对象,所以如果你正在初始化一个未初始化的缓冲区,那么该缓冲区几乎肯定是一个你将使用原始指针的数组。
尽管如此,让迭代器指向 not 数组的未初始化缓冲区是微不足道的,所以我认为这是为了处理这种情况。
答案 1 :(得分:0)
vector<T>::iterator
。他们可以隐藏指针并覆盖operator * ()
- 请参阅http://en.cppreference.com/w/cpp/iterator ::new
可确保拨打新的&#39;来自全球范围(不是std::new
)get_temporary_buffer<T>()
返回pair<T*,ptrdiff_t>
,其大小为&#39;已分配&#39;,可能会少于请求。存储空间可以不同,因为它是为算法的临时缓冲区而设计的(不是为了对堆进行轮询和/或导致堆栈溢出)。