比较以下两种情况:
template<class... Args>
void f1(Args&&... args) { do_smth(std::forward<Args>(args)...); }
auto f2 = [](auto&&... args) { do_smth(std::forward<decltype(args)>(args)...); };
传递给
std::forward
的类型是否有任何差异?
根据我的理解,当您使用
T&&
指定转发引用时,&&
并不与传递的参数“匹配”,而是将“原始引用”信息“存储”到 T
中的一种方式(根据传递参数的值类别,T
将是&
、const &
、&&
或const &&
),然后将此类“原始参考”信息与&&
结合起来计算最终参考使用通常的 & + && = &
规则等进行输入
我不知道的是
decltype(args)
是否会解析为此类计算“之前”或“之后”的类型,或者结果类型是否会与“原始引用”不同,因此是否存在任何差异std::forward
和 f1
.中为
f2
指定的类型
注意: 我无法使用 C++20,模板 lambda 不在问题范围内。
根据值类别,将是T
、&
、const &
或&&
const &&
T
永远不会被推导为右值引用。但它可以被推导为非引用(对于右值参数),可能是 const。
我不知道
是否会解析为此类计算“之前”或“之后”的类型decltype(args)
当然是之后。
这意味着当(虚数)
T
非引用时,decltype
改为接收T &&
。但是 std::forward
以同样的方式对待 T
和 T &&
,所以你的用法是可以的。
此外,您甚至不需要
forward
,只需使用 decltype(args)(args)
(转换为 decltype
d 类型),尽管有些人为了清楚起见更喜欢拼写出多余的 std::forward
。