C++11 引入了语义以避免不必要地复制对象,并std::move
在发生复制时应用这些语义。但是,现在也有一些情况需要副本,但不是默认值。
例如,考虑这个天真的实现reverse
。因为基于范围for
使用完美转发,所以对循环内的容器进行修改就等于损坏。
auto out_iter = container.rbegin();
for ( auto value : container ) {
* out_iter ++ = value;
}
目标是使用
for ( auto value : copy( container ) ) {
看起来很简单……接受任何参数,获取底层类型并返回一个临时副本。