【发布时间】:2020-07-30 05:34:52
【问题描述】:
我遇到了一些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 是int,我们也必须在init 上使用std::move?
【问题讨论】:
-
对于任何类型,您都不必“必须”。
-
重点在于你不知道
T会是什么的通用代码。可以是int,也可以是MyBigFatObject。 -
我在这里看到的唯一优势是,如果有
T operator+(T&&, const T&),这将是令人惊讶的。但我看到有一条注释指出std::move是在 C++20 中添加的,因此可能即将对语言进行更改,这将使这种情况更加普遍。我很好奇为什么不直接使用init += *first。 -
@FrançoisAndrieux:如果
init是一个具有足够大缓冲区的字符串,则会有很大的优势,因为这会从N分配/副本变为0。此外,std::move是在C 中添加的++11. -
@MooingDuck
std::move在 C++20 中被添加到 该函数中。在链接的示例中已注明。使用init += *first也会有同样的好处。虽然我看到std::string确实存在带有右值引用的operator+,但我并不知道。