gpt4 book ai didi

c++ - 哪个构造函数将触发 move 语义?

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:31 24 4
gpt4 key购买 nike

我目前正在学习 C++,并且想知道哪一个是使用 std::move 的正确方法

//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::vector 的 move 构造函数?

是这个吗(调用者不使用std::move时编译报错)

Xyt::ByteArray::ByteArray(std::vector<char>&& Buffer)
{
this->Buffer = Buffer;
}

这个(接受 std::move(Buff) 和 Buff)?

Xyt::ByteArray::ByteArray(std::vector<char> Buffer)
{
this->Buffer = Buffer;
}

还是这个?

Xyt::ByteArray::ByteArray(std::vector<char> Buffer)
{
this->Buffer = std::move(Buffer);
}

我从互联网上了解到,第一个构造函数是利用 move 语义的正确方法。但是,如果我使用第一个构造函数,这是否意味着如果我想在 std::vector Buff 上实际做一个拷贝,我需要创建另一个构造函数?

如有任何帮助,我们将不胜感激!

最佳答案

唯一有效的是第三个。但那是因为您使用了 std::move inside 构造函数。它引发了两个 Action :一个是填充参数,另一个是从参数到值。

正确的做法是:

Xyt::ByteArray::ByteArray(std::vector<char>&& Buf)
: Buffer(std::move(Buf))
{}

这只会调用一次 move 操作。

如果你想调用一个 move 操作,你必须显式地从命名的右值引用中 move 。


But if I use the 1st constructor does that mean I need to make another constructor if I want to actually do a copy on the std::vector Buff ?

您不一定非得这样做。您可以要求用户在调用函数时自己进行复制:

Xyt::ByteArray(std::vector<char>(Buff))

但是是的,如果你希望用户直接提供一个左值,并且你想从左值复制,那么你需要提供一个构造函数,它接受一个 (const) 左值引用并执行一个复制。

关于c++ - 哪个构造函数将触发 move 语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47490610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com