这是关于lambda重载集和完美转发的问题,并且在某种程度上是评论的后续内容。有关如何使用它的更多上下文,请参阅另一个相关问题。
我有一些问题……
这种差异在什么情况下相关?
当至少一个参数实际上是一个左值(比如 identity , 事实上)。在哪种情况下相应 Fi 是一个 T& ,即左值参考。并且不能将左值引用列为任何类的基础,所以 std::decay 需要删除所有引用和cv限定符。当扣除指南按值获取参数时,它自动成为非问题。这是因为值类型的模板参数推导已经“衰减”了类型。
identity
Fi
T&
std::decay
如果你想知道使用哪一个,那么我会说一个杂乱少的人客观上更好。指某东西的用途 std::decay_t 是为了获得与按值版本相同的行为,因此可以使用它。
std::decay_t
为什么要使用return decltype(x)(x)定义下面的identity函数而不只是返回x
这是一种转发形式。由于lambda的返回类型被声明为 decltype(x) ,我们需要强制转换以确保它正确绑定到右值引用。因为在这种情况下 decltype(x) = T&& ,它不会绑定 x 单独,这是一个左值。
decltype(x)
decltype(x) = T&&
x
我们可以考虑吗? foo(convert(std::forward<Args>(args))...) 作为完美转发(对于所有未转换的参数)就像 foo(std::forward<Args>(args)...)
foo(convert(std::forward<Args>(args))...)
foo(std::forward<Args>(args)...)
是。争论的论点 bar 已经绑定参考。 convert 让那些引用通过值类别保留,所以它确实转发。
bar
convert