4

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

例如,考虑这个天真的实现reverse。因为基于范围for使用完美转发,所以对循环内的容器进行修改就等于损坏。

auto out_iter = container.rbegin();
for ( auto value : container ) {
    * out_iter ++ = value;
}

目标是使用

for ( auto value : copy( container ) ) {

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

4

1 回答 1

8

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

template<typename T>
typename std::decay<T>::type
val(T&& t)
{ return std::forward<T>(t); }
于 2011-09-11T05:37:09.227 回答