完美转发等于什么
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
,你就会得到一个左值引用。生活就是这么简单。
我知道这个可以用来进行完美转发:
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
,你就会得到一个左值引用。生活就是这么简单。