C++ 放置新的和未初始化的_fill()的行为

C++ 放置新的和未初始化的_fill()的行为,c++,C++,我看到在下面的未初始化的\u fill实现中使用了新的placement。是否有人知道placement new的底层实现,或者在g++中的何处可以找到它 我假设操作符获取一个指向对象应该放置的位置的指针和对Value(Value)的引用,这是调用复制构造函数后的一个右值 谢谢 template<class ForwardIt, class T> void uninitialized_fill(ForwardIt first, ForwardIt last, const T&

我看到在下面的
未初始化的\u fill
实现中使用了新的placement。是否有人知道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;
    }
}
模板
无效未初始化的填充(ForwardIt first、ForwardIt last、const T和value)
{
typedef typename std::迭代器\特征::值\类型值;
正向电流=第一;
试一试{
对于(;当前!=最后一次;++当前){
::新(静态转换(标准::地址(*当前)))值(值);
}
}捕获(…){
对于(;第一个!=当前;++第一个){
第一->~值();
}
投
}
}
在指定地址构造对象,是

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

此代码中没有使用右值<代码>值(值)
不是传递给
placement new
的右值
Value
placement new
构造的类型,将
Value
作为
Value的
构造函数的输入。如果将
Value
命名为类似
ValueType
TypeToConstruct
的名称,那么代码可能会更有意义


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

新表达式是语言的一部分,不是库功能(也不是运算符)。您可以在语言标准文档中阅读它的行为,感谢您现在阅读它。奇怪的是为什么新出现的是重载操作符。@ NoToRB C++有<代码>新< /COD>表达式和操作符<代码>新< /C> >,这是不同的东西,这是混淆的。一个
new
表达式正在使用
new
创建一个对象,如
newt。它分配内存,如果有,则调用该类型的
new
运算符,如果有,则调用该类型的构造函数。Placement
new
不使用任何
new
运算符,因为不需要分配任何内容。