【发布时间】:2019-08-07 17:18:50
【问题描述】:
我想知道转发:
标准实现std::forward 基本上有两个重载:
- 将左值转发为左值/右值(来自
T)
template<typename T>
T&& forward(lvalue_Reference v){
return static_cast<T&&>(v);
};
- 将 rvalues 转发为 rvalues
template<typename T>
T&& forward(rvalue_Reference v){
// static-assert: T is not an lvalue-Reference
return static_cast<T&&>(v);
};
第一个案例在什么时候开始播放
template<typename T>
void foo(T&& a) { doSomething(std::forward<T>(a)); /* a is lvalue -> matches 1. overload */ }
第二种情况是有道理的,但触发它的例子是什么?
【问题讨论】:
-
好吧,完全取决于用例:-P ...
-
第二种情况是通用引用,它同时转发:左值作为左值,右值作为右值。
-
@SamVarshavchik:第二个参数实际上是:
rvalue_Reference := typename std::remove_reference_t<T>&&,据我所知不是转发引用(通用引用)......所以你的说法不正确。 -
Possible dupe(类似的问题,但我也写了一个回答这个问题的答案)
标签: c++ c++11 templates perfect-forwarding template-argument-deduction