【发布时间】:2016-07-03 02:12: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 作为函数的参数,这确实有效。
但是,如果您使用普通的非 const 左值,则第二个将是模棱两可的。它是调用foo(A&) 还是foo(A)?
【问题讨论】:
-
A&&如果提供右值,A &否则,据我记得。 -
“完美转发”这一短语恰恰源于
A可以根据传递的内容推断出两种不同类型中的任何一种。
标签: c++ templates move-semantics rvalue-reference perfect-forwarding