【问题标题】:What does "std::decay_t<U> (until C++20) std::remove_cvref_t<U> (since C++20)" mean?“std::decay_t<U>(C++20 前)std::remove_cvref_t<U>(C++20 起)”是什么意思?
【发布时间】:2019-11-24 22:20:01
【问题描述】:

谁能给我详细解释一下这句话是什么意思?

template< class U = T >
optional& operator=( U&& value );

4) ...函数不参与重载决议,除非 std::decay_t&lt;U&gt;(C++20 前)std::remove_cvref_t&lt;U&gt;(C++20 起)不是std::optional&lt;T&gt;...

(source)

在第4版中,不带任何动词的“std::decay_t&lt;U&gt; (until C++20) std::remove_cvref_t&lt;U&gt; (since C++20)”是什么意思?有错别字吗?

【问题讨论】:

  • 谢谢。我明白。请您解释一下“函数不参与重载解析,除非”部分?
  • “不参与重载决议”意味着当您将一些非可选分配给可选时,选择了其他一些 operator= 重载,例如 (4)。
  • 我试图深入理解这一点。

标签: c++ optional


【解决方案1】:

这很微妙——两个类周围有一个框,表示子短语。假装它们之间有一个“或”,然后这样读:

函数不参与重载决议,除非 [std::decay_t&lt;U&gt; (C++20 前) 或 std::remove_cvref_t&lt;U&gt; (C++20 起)] 不是 std::optional&lt;T&gt;...

你可以把它读成两个交替的句子:

  • 除非std::decay_t&lt;U&gt; 不是std::optional&lt;T&gt;,否则函数不参与重载决议... (C++20 前)

  • 函数不参与重载决议,除非std::remove_cvref_t&lt;U&gt; 不是std::optional&lt;T&gt;... (C++20 起)

(在 C++20 中,他们收紧了规范并将 decay 替换为 remove_cvref。两者的作用基本相同,但后者更精确。decay,如 remove_cvref , 删除限定符;但它也将数组转换为指针,这与此处无关。)

在英语中,它基本上是在说:

除非U(忽略&amp;&amp;&amp;constvolatile)不是std::optional&lt;T&gt;,否则该函数不参与重载决议...

换句话说,过载 (4) 仅在某些条件下可用。如果不满足这些条件,那么完美转发将被取消;据推测,SFINAE 用于禁用它。

【讨论】:

  • 非常感谢您用英语解释更多。我很感激这种关怀。我现在明白这部分了。对我来说,唯一需要澄清的是句子中在两种情况下都说“函数不参与重载解决”的部分。你能解释一下吗?谢谢
猜你喜欢
  • 2020-10-01
  • 2020-03-19
  • 1970-01-01
  • 2021-05-24
  • 2020-08-06
  • 2021-12-15
  • 2021-10-01
  • 2020-10-05
相关资源
最近更新 更多