C++ std :: forward <T> vs static_cast <T>

Mik*_*aft 7 c++ perfect-forwarding c++11

据我所知,std::forward<T>(x)相当于static_cast<T&&>(x).

但是从我所看到的,static_cast<T>(x)似乎做同样的事情,如下面的代码所示

我的问题是为什么不出std::forward<T>被实现为static_cast<T&&>(x),而不是static_cast<T>(x),如果两者都具有相同的效果?

mya*_*aut 12

因为完美转发允许传递r值引用l值引用.这是通过参考折叠完成的:

T = int    --> T&& = int&&
T = int&   --> T&& = int& && = int&
T = int&&  --> T&& = int&& && = int&&
Run Code Online (Sandbox Code Playgroud)

在你的例子中,static_cast<T>你只是丢失了r值引用.它适用于原始类型(因为传递int通常是复制CPU寄存器值),但对复杂类型来说很糟糕,因为它导致通过复制ctors创建临时对象.

  • `static_cast <T>`可以返回一个引用:上面的答案暗示它不能.你能澄清一下这个问题只出现在一个"案例"中吗? (2认同)