完美转发等于什么

What is Perfect Forwarding equal to

我知道这个可以用来进行完美转发:

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 作为函数的参数,这当然有效。

但是,如果您使用普通的非 const 左值,则第二个将是模棱两可的。它调用 foo(A&) 还是 foo(A)

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

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

它们最初被 Scott Meyers 称为“Univeral References”,现在称为“Forwarding References".

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