我正在阅读ranges::distance
源代码,但没有明白:
- 为什么是
struct __distance_fn
决赛? void operator&() const = delete
(来源)的目的是什么
我知道 final 类没有派生类,而一元操作符&
是获取对象的指针(或类似的东西)。但我不明白他们在这里到底做了什么ranges::distance
。
也是同样的情况ranges::advance/prev/next
,而其他函子没有这样的细节,例如ranges::begin。
- 为什么
ranges::begin
(和其他函子)没有final
或者删除operator &
?
ranges::next
是所谓的niebloid,与定制点对象(CPO)不同,它们不是功能对象。为了模仿它们的特性并防止它们被滥用为对象,libstdc++ 中的这个提交
final
对它们进行添加和删除,oeprator&
以便无法从它们派生并获取它们的地址。另一方面,
ranges::begin
在标准中被指定为CPO,它是一个可以自由复制的功能对象。还有一篇论文P3136:Retiring niebloids,将 niebloids 转变为 CPO,以消除其令人讨厌的非对象性质。