首页 > 解决方案 > 放置 new 和 uninitialized_fill() 的行为

问题描述

我看到在以下实现中使用了placement new uninitialized_fill。有谁知道placement new的底层实现或在g ++中的哪里可以找到它?

我假设运算符Value(value)在调用复制构造函数后获取一个指向对象应该放置的位置的指针和一个右值的引用?

谢谢

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*>(std::addressof(*current))) Value(value);
        }
    }  catch (...) {
        for (; first != current; ++first) {
            first->~Value();
        }
        throw;
    }
}

标签: c++

解决方案


placement-new在指定地址构造一个对象,是的。

在表达式::new (static_cast<void*>(std::addressof(*current))) Value(value);中,*current返回对指定迭代器范围内元素的引用,然后将该元素的地址转换为void*并传递给placement-new,然后在该地址构造一个新Value类型(value_type迭代器的),将输入传递value给该类型的复制构造函数。

此代码中没有使用右值。 Value(value)不是传递给的右值placement-newValue是构造的类型,placement-new作为构造函数value的输入Value'sValue如果将代码命名为更像ValueTypeTypeToConstruct取而代之的名称,也许代码会更有意义。

new (address) Type(params)表达式类似于表达式,只是将new Type(params)额外的address参数作为输入。


推荐阅读