4

当我阅读一些文章时,我发现这条线非常神秘。

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

有人可以解释这种语法是如何工作的吗?

4

2 回答 2

12

好吧,好消息是,这些都不是新语法(但都是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

于 2012-12-21T17:45:15.863 回答
6

它的一个位置。

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

在这里,我们可以将其简化为:

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

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

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

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

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

将这两者结合起来,您将使用数组中的元素作为源对象来使用移动构造来放置新的位置。

于 2012-12-21T17:49:31.753 回答