c++ - 放置 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;
}
}
解决方案
placement-new
在指定地址构造一个对象,是的。
在表达式::new (static_cast<void*>(std::addressof(*current))) Value(value);
中,*current
返回对指定迭代器范围内元素的引用,然后将该元素的地址转换为void*
并传递给placement-new
,然后在该地址构造一个新Value
类型(value_type
迭代器的),将输入传递value
给该类型的复制构造函数。
此代码中没有使用右值。 Value(value)
不是传递给的右值placement-new
。 Value
是构造的类型,placement-new
作为构造函数value
的输入Value's
。Value
如果将代码命名为更像ValueType
或TypeToConstruct
取而代之的名称,也许代码会更有意义。
new (address) Type(params)
表达式类似于表达式,只是将new Type(params)
额外的address
参数作为输入。
推荐阅读
- php - 如何使用 codeignator 在数据库中插入文件名并在文件夹中插入文件?
- angular - 角度计数器触发事件
- javascript - ChartJS 响应式调整打印大小 - 在 Firefox/IE11/Edge 中不起作用
- asp.net-mvc - 如何将创建的文件附加到邮件 mvc
- twitter-bootstrap - 在 Boostrap 4 中覆盖/自定义 mixin
- javascript - 在 Microsoft Teams 中使用 Word 时调用对话框 api 会打开浏览器
- twig - 覆盖 bolt.cms 中的后端模板
- python - Django使用ManyToMany过滤不止一次映射
- c# - 当您必须考虑数组元素的两个邻居时,如何解决索引越界问题?
- java - c# this.GetType().Namespace 的 Java 等价物