gpt4 book ai didi

c++ - 下面的 std::move 是多余的吗?

转载 作者:搜寻专家 更新时间:2023-10-30 23:53:28 25 4
gpt4 key购买 nike

下面的 std::move 是多余的吗?

std::string member;

obj(std::initializer_list<std::string> p_list)
: member {std::move(join(p_list))}
{}

这是连接函数:

std::string join(string_initializer_list p_list) {
size_t size {};
for (auto const & s : p_list) {
size += s.size();
}
std::string output;
output.reserve(size);
for (auto const & s : p_list) {
output.append(s);
}
return output;
}

最佳答案

不,你不需要std::movestd::move 的功能是将任何值转换为右值。您的函数已经返回一个右值,因此就将结果绑定(bind)到引用而言,强制转换没有任何效果(这是您从右值初始化 member 所追求的)。

事实上,主动使用std::move抑制复制省略,所以它是一个严格的悲观化:

std::string s = join({});             // construct from prvalue, elidable,
// elision mandatory in C++17

std::string s = std::move(join({})); // temporary object must be constructed,
// s is initialized by moving from the
// temporary

第一种形式std::string s = join({});,copy elision是指直接构造join的返回对象代替s(没有构造临时对象,只做copy或move),而且函数体中的output变量也被省略,直接在返回值中构造,即在 s 中。对于 std::move,第一个省略步骤不可用。

关于c++ - 下面的 std::move 是多余的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900883/

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