如何理解以下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
答案 0 :(得分:6)
这称为“新放置”。基本思想是提供一个地址,然后调用该类型的构造函数以在该地址创建对象。
在典型情况下,您会给它一个“原始”内存地址,而不是现有对象的地址。实际上,我不确定上面的代码是否确实定义了行为(尽管我必须仔细查看该标准以确保它是否有效)。
它最常用于诸如收集类之类的事情,这些类分配原始内存,当您执行诸如insert
或push_back
之类的操作时,它将在该内存中构造一个对象。标准集合对象通过分配器对象来处理构造,但最后(至少通常)它将作为新的放置完成实际工作。
您传递给new
的参数将传递给要创建的对象的构造函数。因此,在您的情况下,它将把x
复制到位于y
地址的新字符串中(即,它将y
替换为x
的副本)。