C++ 在模板参数和 lambda 的 `auto` 参数之间转发引用方面的差异

问题描述 投票:0回答:1

比较以下两种情况:

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 不在问题范围内。

c++ reference c++17 rvalue-reference forwarding-reference
1个回答
0
投票
根据值类别,

T
将是
&
const &
&&
const &&

T
永远不会被推导为右值引用。但它可以被推导为非引用(对于右值参数),可能是 const。

我不知道

decltype(args)
是否会解析为此类计算“之前”或“之后”的类型

当然是之后。

这意味着当(虚数)

T
非引用时,
decltype
改为接收
T &&
。但是
std::forward
以同样的方式对待
T
T &&
,所以你的用法是可以的。

此外,您甚至不需要

forward
,只需使用
decltype(args)(args)
(转换为
decltype
d 类型),尽管有些人为了清楚起见更喜欢拼写出多余的
std::forward

© www.soinside.com 2019 - 2024. All rights reserved.