【问题标题】:What is Perfect Forwarding equal to什么是完美转发等于
【发布时间】: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&amp;)void foo(A&amp;&amp;)

void foo(A&amp;)void foo(A)

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

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

【问题讨论】:

  • A&amp;&amp; 如果提供右值,A &amp; 否则,据我记得。
  • “完美转发”这一短语恰恰源于A 可以根据传递的内容推断出两种不同类型中的任何一种。

标签: c++ templates move-semantics rvalue-reference perfect-forwarding


【解决方案1】:

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

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

【讨论】:

  • 这意味着它将扩展到 A&amp;&amp; 用于右值,A&amp; 用于左值,A const&amp; 用于 const 左值(但不是右值)?
  • @hgiesel 再读一遍:也会为右值推导出适当的 cv 限定符。否则无法进行引用绑定。
【解决方案2】:

Scott Meyers 最初将它们称为“Universal References”,现在称为“Forwarding References”。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2014-09-06
    相关资源
    最近更新 更多