当我读一些文章时,我发现这条线太神秘了。
new (new_ptr + i) T(std::move(old_ptr[i]));
有人可以解释这种语法是如何工作的吗?
答案 0 :(得分:12)
new
语法,好吧!)。在C ++ 11 std::move
中引入了一个正在使用的函数,但就是它。
该行的语法称为 placement new
,并且已经存在了很长一段时间。它允许您在内存中的某个已分配的空间中创建对象。这里,已经分配的内存由指针new_ptr + i
给出。在那里创建的对象的类型是T
。
一个简单而毫无意义的新位置示例是:
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。
答案 1 :(得分:6)
它是一个位置。
new (new_ptr + i) T(std::move(old_ptr[i]));
我们可以将此简化为:
new (<destinationLocation>) T(<constructor parameters);
这是normall C ++ 03,基本上允许你在预分配的内存区域中动态创建一个对象(这是一种大多数人不会使用的高级技术(除非他们正在构建自己的容器)对象))。
std :: move()部分来自C ++ 11,并且正在创建一个特殊的引用类型,允许在T类型中使用移动构造函数。
new T(std::move(<source Obj>));
这基本上说是使用源对象创建一个新的T并使用移动构造函数来提高效率。这意味着'源Obj'将在移动后保持未定义状态(因此不可用),但它允许有效的对象创建。
使用数组中的元素作为源对象,将两者结合使用移动构造。