当我读一些文章时,我发现这条线是如此神秘.
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从中窃取.要了解有关此内容的更多信息,请查看移动语义.
它是一个位置.
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'将在移动后保持未定义状态(因此不可用),但它允许有效的对象创建.
结合这两个,你可以使用数组中的元素作为源对象来获得移动构造的新位置.
| 归档时间: |
|
| 查看次数: |
260 次 |
| 最近记录: |