缺少一元std::copy的最佳实现

Best implementation of the missing unary std::copy

本文关键字:copy 最佳 实现 std 一元      更新时间:2023-10-16

c++ 11引入了语义来避免不必要的复制对象,而std::move则在发生复制时应用这些语义。但是,现在也有一些情况需要一个副本,但不是默认的。

例如,考虑reverse的这个朴素实现。因为基于范围的for使用完美转发,所以对循环内容器的修改相当于损坏。
auto out_iter = container.rbegin();
for ( auto value : container ) {
    * out_iter ++ = value;
}
目标是使用 来解决这个问题。
for ( auto value : copy( container ) ) {

看起来很简单…接受任何参数,获取底层类型并返回临时副本。

您正在计算的返回类型通常称为typename std::decay<T>::type。除此之外,在正文中使用std::forward可以获得完美转发的全部好处:

template<typename T>
typename std::decay<T>::type
val(T&& t)
{ return std::forward<T>(t); }