什么是完美转发等于

What is Perfect Forwarding equal to

本文关键字:转发 完美 什么      更新时间:2023-10-16

我知道这可以用来执行完美的转发:

template <typename A>
void foo(A&&) { /* */ }

这可用于对特定类型执行完美转发:

template <typename A, std::enable_if_t<std::is_same<std::decay_t<A>, int>::value, int> = 0>
void foo(A&&) { /* */ }
但这些只是函数的模板,

这意味着,这些模板被扩展到一些函数,然后用于可能使用它的每个特殊情况。但是,这些是否扩展到:

void foo(A&)void foo(A&&)

void foo(A&)void foo(A)

我一直认为,这将是第一个,但后来我注意到,在这种情况下,您将无法使用A const作为函数的参数,这当然有效。

但是,如果您使用正常的非常量左值,则第二个将是模棱两可的。它叫foo(A&)还是foo(A)

这是

第一个。第二个没有多大意义:没有AA&&是非引用类型。

如果参数是 cv T 类型的左值,则A推导为 cv T& 。如果参数是 cv T 类型的右值,则A被推导为 cv TA&&cv T&&因此,当您传入const左值时,生成的专用化是可以接受const参数的专用化。

它们最初被Scott Meyers称为"Univeral References",现在是"Forwarding References"。

如您所见,引用部分没有更改。你传入任何类型的rvalue,你会得到一个rvalue参考。你传入任何类型的lvalue,你会得到一个左值引用。生活就是这么简单。