什么是完美转发等于

hgi*_*sel 0 c++ templates rvalue-reference move-semantics perfect-forwarding

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

template <typename A>
void foo(A&&) { /* */ }
Run Code Online (Sandbox Code Playgroud)

这可以用于在某种类型上执行完美转发:

template <typename A, std::enable_if_t<std::is_same<std::decay_t<A>, int>::value, int> = 0>
void foo(A&&) { /* */ }
Run Code Online (Sandbox Code Playgroud)

但这些只是函数的模板,这意味着,这些函数会扩展为某些函数,然后将这些函数用于可能使用它的每个特殊情况.但是,这些扩展到:

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

要么

void foo(A&)void foo(A)

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

然而,如果您使用正常的非常数左值,则第二个将是不明确的.它会打电话foo(A&)还是foo(A)

Bri*_*ian 5

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

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