Mil*_*uli 0 c++ containers vector std
我正在上一门课,我需要有该课的向量。我希望就地构造对象而不是使用复制构造。看来使用复制构造是不可避免的。
#include <iostream>
#include <string>
#include <vector>
class MyData {
public:
int age;
std::string name;
MyData(int age, std::string name) : age(age), name(name)
{
std::cout << "MyData::MyData(int, std::string)\n";
}
MyData(const MyData& myData) : age(myData.age), name(myData.name)
{
std::cout << "MyData::MyData(const MyData&)\n";
}
MyData(MyData&& myData)
:age(std::move(myData.age)), name(std::move(myData.name))
{
std::cout << "MyData::MyData(MyData&&)\n";
}
~MyData() {
std::cout << "MyData::~MyData()\n";
}
};
#define DEBUG(...) std::cout << "Exec: " #__VA_ARGS__ << ";\n"; __VA_ARGS__
int main()
{
DEBUG(std::vector<MyData> sb1);
DEBUG(sb1.emplace_back(MyData{ 32, "SJ" }));
DEBUG(sb1.emplace_back(MyData{ 42, "SJ" }));
}
Run Code Online (Sandbox Code Playgroud)
代码的输出如下:
Exec: std::vector<MyData> sb1;
Exec: sb1.emplace_back(MyData{ 32, "SJ" });
MyData::MyData(int, std::string)
MyData::MyData(MyData&&)
MyData::~MyData()
Exec: sb1.emplace_back(MyData{ 42, "SJ" });
MyData::MyData(int, std::string)
MyData::MyData(MyData&&)
MyData::MyData(const MyData&)
MyData::~MyData()
MyData::~MyData()
MyData::~MyData()
MyData::~MyData()
C:\Users\XOXOX\source\repos\cpp_stack\x64\Debug\cpp_stack.exe (process 12832) exited with code 0.
Press any key to close this window . . .
Run Code Online (Sandbox Code Playgroud)
我正在使用 C++ 2020 和 MSVC。
首先当你写的时候
DEBUG(sb1.emplace_back(MyData{ 32, "SJ" }));
Run Code Online (Sandbox Code Playgroud)
您创建一个传递给emplaced_back函数的临时对象。的要点emplace_back是它就地调用构造函数。因此,您必须为其提供创建对象的参数,而不是临时对象,否则它将必须使用复制/移动构造函数。
第二个sb1是容量为 0 的向量。因此,向其中添加项目将必须调整大小,这意味着复制,因为移动构造函数不是noexcept。std::vector无法在调整大小期间处理异常,因此不能冒险使用移动构造函数。
您应该保留右侧以避免调整大小。