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)
看起来很简单......接受任何参数,获取基础类型并返回临时副本.
您正在计算的返回类型更为人所知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)