【问题标题】:Is a parameter type with `T&&` in it and `T` deduced always a universal reference?带有`T&&`的参数类型和推导的`T`总是通用引用吗?
【发布时间】:2021-03-05 11:24:46
【问题描述】:

参考

template<typename T>
void fun(ParamType param); // ParamType is some form of T, e.g. T, T&, T const, ...

fun(expr); // expr is an expression

我知道ParamType 中的&amp;&amp;“某处”不足以使ParamType 成为通用引用,例如ParamType = std::vector&lt;T&gt;&amp;&amp; 是右值引用。 &amp;&amp; 需要在模板参数 T 旁边,因为它 (T&amp;&amp;)可能是一个通用引用。

但我也知道ParamType 中的T&amp;&amp; "somewhere" 仍然不够,例如ParamType = std::remove_reference_t&lt;T&amp;&amp;&gt; 不是通用引用。

因此,我几乎是在问ParamType 的“表格”是否有/有什么要求才能作为转发参考?

不过,by doing a bit of research,我觉得我需要问一个更“二进制”的问题:

为简单起见,假设T 是唯一的模板参数,因此ParamTypeT 的唯一函数(在数学意义上),如果这两个都为真,是否正确

  • TParamType 的形式出现T&amp;&amp;
  • fun 推导出TPramType(即T 不需要通过fun&lt;T&gt; 传递)

那么ParamType 是通用引用吗?

换句话说,如果ParamType 中包含T&amp;&amp; 并推导出T,那么它是否总是一个通用引用?

【问题讨论】:

    标签: c++ c++11 template-meta-programming rvalue-reference forwarding-reference


    【解决方案1】:

    ParamType 的“形式”作为转发引用有什么要求?

    来自标准(最新草案):

    [temp.deduct.call] 转发引用是对不代表类模板的模板参数的 cv 非限定模板参数的右值引用


    其中包含T&amp;&amp;T 的参数类型是否总是推导出一个通用引用?

    类型“在”什么并不重要,重要的是类型是什么。如果它是对函数模板参数的 cv 非限定右值引用,则它是转发引用。

    例如,Foo&lt;T&amp;&amp;&gt;T&amp;&amp;“在其中”,但它不是转发引用。 ParamType 也不能是转发引用,因为它不是函数的模板参数。

    【讨论】:

    • 嗯,这很有帮助,但我开始认为如果ParamType 不仅仅是T&amp;&amp;,就没有办法有一个通用的参考。这是正确的吗?
    • @Enrico 这是获得转发参考的唯一方法。
    • 这是获得转发参考的唯一方法。这是否意味着这是它可以成为转发引用的唯一方式这是它可以成为并且是的唯一方式 转发参考?根据您从标准中引用的摘录,看起来是后一种情况。
    • @Enrico 如果在拨打电话时没有推断出T&amp;&amp; 左侧的东西),它将不再是转发引用,例如因为您手动指定了模板参数。
    • @Enrico 根据您希望参数不是转发引用的原因,该问题的解决方案可能是左值引用重载,这将优于通用引用重载,或基于 std::enable_if 的 SFINAE这会阻止函数对左值有效。
    【解决方案2】:

    不,不是。

    我没有想到明显的案例!

    template<typename T>
    void fun(const T&&) {}
    

    这里T&amp;&amp;ParamType的一部分(即const T&amp;&amp;),T是推导出来的,但ParamType是一个右值引用。

    (可能我没有想到这一点,因为我养成了将const放在类型后面的习惯,就像T const&amp;&amp;一样。)

    【讨论】:

    • 请注意,“通用引用”是 Scott Meyers 创造的一个术语,后来被赋予了转发引用的官方名称。斯科特在意识到他们根本需要一个名字方面做得很好。他的文章可能会有所帮助:isocpp.org/blog/2012/11/…
    • 是的,我正在第二次或第三次阅读那本书并为自己写一些摘要,这就是我问这个问题的原因,我将其标记为 forwarding-reference因为你提到的原因。您的评论肯定对读者有用。
    猜你喜欢
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    相关资源
    最近更新 更多