C++ std::string 语法 "new (&y) std::string(x);"

标签 c++ string constructor

如何理解下面的std::string初始化语法?

#include <iostream>
#include <string>

int main ()
{
    std::string y;
    std::string x = "x str";
    new (&y) std::string(x);
    std::cout << y << std::endl;

    return 0;
}

输出:

x str

我们可以将语句分成两步吗?

1.

string* temp = new std::string(x);

2.

(&y) = temp

所以原始语句只是步骤 1 + 2 的快捷方式。

引用:

1. https://en.cppreference.com/w/cpp/string/basic_string/basic_string

2。 https://en.cppreference.com/w/cpp/string/basic_string

最佳答案

这称为“新展示位置”。基本思想是您提供一个地址,它会调用该类型的构造函数以在该地址创建一个对象。

在典型情况下,您会给它一个“原始”内存地址,而不是现有对象的地址。事实上,我不确定上面的代码是否真的定义了行为(尽管我必须仔细查看标准以确定它是否定义了行为)。

它最常用于诸如分配原始内存的集合类之类的事情,当您执行诸如 insertpush_back 之类的操作时,它会在该内存中构造一个对象。标准集合对象通过一个分配器对象来处理构造,但最终,它(至少通常)会作为新放置完成真正的工作。

您传递给 new 的参数将传递给正在创建的对象的构造函数。因此,在您的情况下,它将 x 复制到 y 地址处的新字符串中(即,它将 y 替换为x 的拷贝)。

关于C++ std::string 语法 "new (&y) std::string(x);",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57733127/

相关文章:

python - 如何在pandas数据框+ python中的一列中查找<>之间的多个子字符串

c++ - 降低字符串比较的时间复杂度

constructor - 如何使用工厂常量构造函数?

c++ - 注入(inject)模板构造函数

c++ - 在 pragma pack 中包含 std map 会导致崩溃

.net - 可以从 .net 调用的非常简单的 C++ DLL

c++ - AMD GPU 在 OpenGL 3.3 中可以绘制的顶点数是否有最大限制?

c++ - GNU ld 找不到存在的库

c++ - 是否可以在 C++ 中传递一个将参数传入集合的构造函数?

javascript - 如何为构造函数/原型(prototype)函数添加值?