如何使用新语法

K.K*_*K.K 4 c++

当我读一些文章时,我发现这条线是如此神秘.

new (new_ptr + i) T(std::move(old_ptr[i]));
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*eld 12

嗯,好消息是,它们都不是新语法(但所有这些都是new语法,好吧!).在C++ 11中引入了一个使用的函数std::move,但就是这样.

该行的语法称为放置,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
Run Code Online (Sandbox Code Playgroud)

T正在传递构造函数std::move(old_ptr[i]).假设old_ptr在类型的对象点T,此举允许移动构造函数T被用于创建对象.它基本上假装这old_ptr[i]是一个临时T对象(即使它实际上可能不是),允许新手T从中窃取.要了解有关此内容的更多信息,请查看移动语义.


Mar*_*ork 6

它是一个位置.

new (new_ptr + i) T(std::move(old_ptr[i]));
Run Code Online (Sandbox Code Playgroud)

在这里我们可以简化为:

new (<destinationLocation>) T(<constructor parameters);
Run Code Online (Sandbox Code Playgroud)

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

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

new T(std::move(<source Obj>));
Run Code Online (Sandbox Code Playgroud)

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

结合这两个,你可以使用数组中的元素作为源对象来获得移动构造的新位置.