丢失的一元std :: copy的最佳实现

Pot*_*ter 4 c++ copy-constructor rvalue-reference c++11

C++ 11引入了语义以避免不必要地复制对象,并std::move在发生复制时应用这些语义.但是,现在还有一些情况需要复制,但不是默认情况.

reverse例如,考虑这种天真的实现.由于基于范围的for使用完美转发,因此在循环内对容器的修改等于损坏.

auto out_iter = container.rbegin();
for ( auto value : container ) {
    * out_iter ++ = value;
}
Run Code Online (Sandbox Code Playgroud)

目标是使用这个来解决这个问题

for ( auto value : copy( container ) ) {
Run Code Online (Sandbox Code Playgroud)

看起来很简单......接受任何参数,获取基础类型并返回临时副本.

Luc*_*ton 8

您正在计算的返回类型更为人所知typename std::decay<T>::type.除此之外,std::forward在身体中使用以获得完美转发的全部好处:

template<typename T>
typename std::decay<T>::type
val(T&& t)
{ return std::forward<T>(t); }
Run Code Online (Sandbox Code Playgroud)

  • 非常好!完美转发还具有通过rvalue不变的效果,因此`val(move(x))`和`val(X())`do*not*实际上是一个副本.这使得这个功能与我的功能截然不同(并且更优越),并且值得使用不同的名称. (2认同)