http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0644r1.html的文件表示:
“完全等效”适用的原因是因为There are two ways that you can forward a variable: you can use std::forward or you can use static_cast directly (as this proposal's forwarding operator does):
template <class X, class Y> decltype(auto) foo(X&& x, Y&& y) { return std::forward<X>(x)(std::forward<Y>(y)); // with std::forward return static_cast<X&&>(x)(static_cast<Y&&>(y)); // with static_cast, exactly equivalent }
X
和Y
是模板参数,所以X&&
和Y&&
是转发引用吗?还是其他原因?我认为它并不总是适用,因为如果是这样:
- 我会期望
std::forward
的文档中也有说明,就像 std::move 的文档中一样; - 用一个替换另一个为什么会导致14%的编译速度提升呢。
std::forward
在某些情况下无法编译,而static_cast
可以;- 但反过来不一定成立:如果
std::forward
可以编译,那么static_cast
也可以; - 如果两者都可以编译,结果是相同的。
X
,还要考虑参数/操作数的类型。除了你想要考虑的示例中的关系之外,它们之间是否存在其他关系,或者你真的在询问所有可能性? - Davis Herring