gpt4 book ai didi

c++ - std::move 一个将被覆盖的变量

转载 作者:行者123 更新时间:2023-12-01 14:11:34 25 4
gpt4 key购买 nike

我遇到了一些 code

template<class InputIt, class T>
constexpr // since C++20
T accumulate(InputIt first, InputIt last, T init)
{
for (; first != last; ++first) {
init = std::move(init) + *first; // std::move since C++20
}
return init;
}

我有一个问题。为什么我们必须在 init 上使用 std::move,即使 initint

最佳答案

你是对的,移动一个 int 与复制它没有什么不同。

这里,std::move 仅在 T 的重载 operator+ 对左值和右值的行为不同时才有用。

我从未听说过这样的类,但我想它可能对以巧妙的方式重载 + 的动态数组有用:

struct Vec
{
std::vector<int> elems;
};

// Returns a completely new vector.
Vec operator+(const Vec &a, const Vec &b)
{
assert(a.size() == b.size());
Vec ret(a.size());
for (std::size_t i = 0; i < a.size(); i++)
ret.elems[i] = a.elems[i] + b.elems[i];
return ret;
}
// Reuses storage of `a`.
Vec operator+(Vec &&a, const Vec &b)
{
assert(a.size() == b.size());
for (std::size_t i = 0; i < a.size(); i++)
a.elems[i] += b.elems[i];
return std::move(a);
}
// Reuses storage of `b`.
Vec operator+(const Vec &a, Vec &&b)
{
return std::move(b) + a;
}
// Reuses storage of `a`.
Vec operator+(Vec &&a, Vec &&b)
{
return std::move(a) + b;
}

Edit: 显然 std::string 做了类似的事情:如果可能,它的 + 会重用其中一个操作数的存储。 (感谢@FrançoisAndrieux 和@Artyer。)

关于c++ - std::move 一个将被覆盖的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61259389/

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