当我阅读一些文章时,我发现这条线非常神秘。
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 中使用移动构造函数。
new T(std::move(<source Obj>));
这基本上是说使用源对象创建一个新的 T 并使用移动构造函数来提高效率。这意味着“源 Obj”在移动后将处于未定义状态(因此不可用),但它允许高效的对象创建。
将这两者结合起来,您将使用数组中的元素作为源对象来使用移动构造来放置新的位置。