如何使用新语法
How to use new syntax
当我阅读一些文章时,我发现这一行是如此的神秘。
new (new_ptr + i) T(std::move(old_ptr[i]));
谁能解释一下这个语法是如何工作的?
好消息是,这些都不是新语法(但都是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
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中使用move构造函数。
new T(std::move(<source Obj>));
这基本上是说使用源对象创建一个新的T,并使用move构造函数来提高效率。这意味着'源对象'将在移动后保持未定义状态(因此不可用),但它允许有效的对象创建。
将两者结合使用,您将获得放置new和使用数组元素作为源对象的move构造。
相关文章:
- 使用基类指针调用基类的值构造函数的语法是什么?
- C++使用 rand 定义函数语法
- 我该怎么做才能摆脱使用命名空间时的语法错误?
- 你如何使std::变体的使用更"palatable",语法方面?
- priority_queue使用降序向量实现最小堆的语法差异
- 如何使用新语法QT5将信号连接到信号?
- c++ 获取非语法使用"&"创建指针
- QObject::连接不起作用 - 使用函数语法找不到信号
- 使用语法公开派生类中的基类别名模板和变量模板?
- 截至 C++14 起尾随返回类型语法的合法使用
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- 非标准语法,使用 & 创建指向成员的指针
- VIM语法在使用MBED开发时找不到标头文件
- VS2017 非标准语法。使用 ' &' 创建成员指针
- 将gcc属性与C++11属性语法结合使用
- C++:有没有一种有效的方法来语法上使用指针等索引
- 语法错误:使用指向对象的指针调用成员函数指针
- 询问基本C++语法细节;使用 & 内部初始化与外部初始化
- 重载精神语法以使用lexer或qi解析器