据我所知,std :: forward< T>(x)等同于static_cast< T&&>(x).
但是从我看到的情况来看,static_cast< T>(x)似乎做了同样的事情,如下面的code所示
我的问题是为什么std :: forward< T>实现为static_cast< T&&>(x),而不是static_cast< T>(x),如果两者具有相同的效果?
解决方法
因为完美转发允许传递r值引用和l值引用.这是通过
reference collapsing完成的:
T = int --> T&& = int&& T = int& --> T&& = int& && = int& T = int&& --> T&& = int&& && = int&&
在您的示例中使用static_cast< T>你只是失去了r值参考.它适用于原始类型(因为传递int通常是复制cpu寄存器值),但是对于复杂类型来说很糟糕,因为它导致通过复制ctors创建临时对象.