如何使用新语法

时间:2012-12-21 17:41:34

标签: c++

当我读一些文章时,我发现这条线太神秘了。

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

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

2 个答案:

答案 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'将在移动后保持未定义状态(因此不可用),但它允许有效的对象创建。

使用数组中的元素作为源对象,将两者结合使用移动构造。