有人可以向我详细解释这句话的意思吗?
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, 2, 2, 3, 3, 3, 3, 3],
'brand' : ['A', 'B', 'A', 'C', 'X', 'A', 'C', 'X', '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起)”是什么意思?有错字吗?
答案 0 :(得分:2)
这很微妙-两个类周围都有一个框,指示子短语。假装它们之间有一个“或”,然后这样阅读:
该函数不参与重载解析,除非[
std::decay_t<U>
(直到C ++ 20)或std::remove_cvref_t<U>
(从C ++ 20起)不是std::optional<T>
... < / p>
您可以将其阅读为两个备用句子:
该函数不参与重载解析,除非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用于禁用它。