如何使用新语法

How to use new syntax

本文关键字:语法 何使用 新语法      更新时间:2023-10-16

当我阅读一些文章时,我发现这一行是如此的神秘。

new (new_ptr + i) T(std::move(old_ptr[i]));

谁能解释一下这个语法是如何工作的?

好消息是,这些都不是新语法(但都是new语法,呵呵!)这里有一个在c++ 11中引入的函数,std::move,但仅此而已。

这一行的语法被称为位置new ,已经存在了很长一段时间。它允许您在内存中已经分配的空间中创建对象。这里,已经分配的内存是由指针new_ptr + i给出的。正在创建的对象类型为T

放置new的一个简单而无意义的例子是:
int* p = new int(); // Allocate and initialise an int
new (p) int(); // Initialise a new int in the space allocated before

T的构造函数被传递给std::move(old_ptr[i])。假设old_ptr指向类型为T的对象,此移动允许使用T移动构造函数来创建对象。它基本上假装old_ptr[i]是一个临时的T对象(即使它实际上可能不是),允许新的T从它那里窃取。要了解更多信息,请查找move semantics。

这是一个位置

new (new_ptr + i) T(std::move(old_ptr[i]));

这里我们可以简化为:

new (<destinationLocation>) T(<constructor parameters);

这是正常的c++ 03,基本上允许你在预先分配的内存区域动态创建对象(这是一种高级技术,大多数人不会使用(除非他们像对象一样构建自己的容器))。

std::move()部分来自c++ 11,它创建了一个特殊的引用类型,允许在类型t中使用move构造函数。

new T(std::move(<source Obj>));

这基本上是说使用源对象创建一个新的T,并使用move构造函数来提高效率。这意味着'源对象'将在移动后保持未定义状态(因此不可用),但它允许有效的对象创建。

将两者结合使用,您将获得放置new和使用数组元素作为源对象的move构造。