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
运算符,如果有,则调用该类型的构造函数。Placementnew
不使用任何new
运算符,因为不需要分配任何内容。