"std::decay_t<U> (until C++20) std::remove_cvref_t<U> (since C++20)" 的意思是什么?

3

有人能详细解释一下这句话的意思吗?

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

4) ...The function does not participate in overload resolution unless std::decay_t<U> (until C++20) std::remove_cvref_t<U> (since C++20) is not std::optional<T>...

(来源)

在第四个版本中,如果没有动词,写“std::decay_t<U>(直到C++20)std::remove_cvref_t<U>(自C++20起)”意味着什么?这是一个笔误吗?


谢谢。我明白了。您能否解释一下“该函数不参与重载决议,除非”的部分? - Dev
2
“不参与重载决议” 意味着在将非可选参数分配给可选参数时,选择了运算符=的另一个重载版本,例如(4)。 - Öö Tiib
我尽力深入理解。 - Dev
1个回答

3

这里有一个细节——两个类周围有一个框,表示它们是一个子短语。假设它们之间有一个“或”并像这样阅读:

除非 [ std::decay_t<U>(在C++20之前)或者 std::remove_cvref_t<U>(自C++20起)] 不是 std::optional<T>,函数才不参与重载决议...

你可以将其解读为两个交替的句子:

  • 除非 std::decay_t<U> 不是 std::optional<T>... (在C++20之前),否则函数不参与重载决议。

  • 除非 std::remove_cvref_t<U> 不是 std::optional<T>... (自C++20起),否则函数不参与重载决议。

在C++20中,他们收紧了规范,并用remove_cvref替换了decay。两者基本上做同样的事情,但后者更加精确。像remove_cvref一样,decay会删除限定符;但它还将数组转换为指针,这在这里不相关。
换句话说,重载(4)只能在特定条件下使用。如果不满足这些条件,则无法进行完美转发;可能会使用SFINAE来禁用它。

非常感谢您用英语进一步解释。我很感激您的关心。我现在理解了这部分内容。唯一需要澄清的是句子中提到的“该函数在重载决策中不参与”的部分。您能否请再解释一下?谢谢。 - Dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接