目前,我正在学习C++,并琢磨一下其中之一就是使用std ::移动哪个构造函数会触发移动语义?
//Code might be incorrect since I havent tested it out
Xyt::ByteArray* Xyt::ResourceManager::LoadFileToByteArray(std::string Path)
{
try {
std::ifstream FileStream(Path, std::ios::in);
std::ifstream::pos_type Pos = FileStream.tellg();
FileStream.seekg(0, std::ios::beg);
std::vector<char> Buff(Pos);
FileStream.read(Buff.data(), Pos);
FileStream.close();
//I want to trigger the move constructor here
return new Xyt::ByteArray(std::move(Buff));
}
catch (std::exception e) {
std::cout << "ERROR::FILE::FILE_NOT_SUCCESFULLY_READ" << Path << std::endl;
return nullptr;
}
}
我感到困惑的是哪一个会引发性病,此举构造正确的方式::矢量?
它是这一个(编译错误时,主叫方犯规使用std ::移动)
Xyt::ByteArray::ByteArray(std::vector<char>&& Buffer)
{
this->Buffer = Buffer;
}
这一个(同时接受的std ::移动(浅黄色)和浅黄色)?
Xyt::ByteArray::ByteArray(std::vector<char> Buffer)
{
this->Buffer = Buffer;
}
or this one?
Xyt::ByteArray::ByteArray(std::vector<char> Buffer)
{
this->Buffer = std::move(Buffer);
}
我从阅读在互联网,即第一构造是利用移动语义的正确方法的理解。但是,如果我使用第一个构造函数,这是否意味着我需要做另一个构造函数,如果我想实际上在std :: vector Buff上进行复制?
任何帮助,将不胜感激!
我想我明白了。还有一件事, Xyt :: ByteArray :: ByteArray(std :: vector && Buffer) this-> Buffer = std :: move(Buffer); },如果做这样一个std ::移动,这会调用移动构造函数两次类似于第三个构造函数吗? –
Xyten
@ Xyten:不会。它根本不会调用move *构造函数*。它会调用move * assignment *,因为'ByteArray :: Buffer'是一个*活动对象*。这就是为什么我使用成员初始化器;这就是你对成员进行初始化的地方。 –