“ std :: decay_t <U>(直到C ++ 20)std :: remove_cvref_t <U>(自C ++ 20起)”是什么意思?

有人可以向我详细解释这句话的意思吗?

std::decay_t<U>
     

4)...该函数不参与重载解析,除非   std::remove_cvref_t<U>(直到C ++ 20)std::optional<T>(因为C ++ 20)不是std::decay_t<U> ...

source

在第4版中,写“ std::remove_cvref_t<U>(直到C ++ 20)df1 = pd.DataFrame({'unique_id' : [1,1,2,3,3],'brand' : ['A','B','A','C','X','X']}) print(df1) unique_id brand 0 1 A 1 1 B 2 2 A 3 2 C 4 2 X 5 3 A 6 3 C 7 3 X 8 3 X 9 3 X (自C ++ 20起)”是什么意思?有错字吗?

ccdelan 回答:“ std :: decay_t <U>(直到C ++ 20)std :: remove_cvref_t <U>(自C ++ 20起)”是什么意思?

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

  

该函数不参与重载解析,除非[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中,他们收紧了规范,并用decay代替了remove_cvref。两者的作用基本相同,但后者在外科手术上更为精确。{{1} },就像decay一样,删除了限定符;但是它也将数组变成了指针,这在这里与之无关。)

用英语本质上是说:

  

该函数不会参与重载解析,除非remove_cvref(忽略U&&&const(不是{{1}) } ...

换句话说,过载(4)仅在某些条件下可用。如果不满足这些条件,则可以进行完美转发。大概是SFINAE用于禁用它。

本文链接:https://www.f2er.com/3039907.html

大家都在问