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

sky*_*ree 0 c++ string constructor

如何理解以下std::stringinit语法?

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

x str
Run Code Online (Sandbox Code Playgroud)

我们可以将语句分为两个步骤吗?

1。

string* temp = new std::string(x);
Run Code Online (Sandbox Code Playgroud)

2。

(&y) = temp
Run Code Online (Sandbox Code Playgroud)

因此,原始语句只是步骤1 + 2的快捷方式。

参考:

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

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

Jer*_*fin 6

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

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

它最常用于集合类(分配原始内存)之类的东西,当您执行诸如insert或时push_back,它会在该内存中构造一个对象。标准集合对象通过分配器对象来处理构造,但是最后(至少通常)它将作为放置新对象而完成实际工作。

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