为什么 shared_ptr<T>::use_count() 返回 long 而不是无符号类型?

Why does shared_ptr<T>::use_count() return a long instead of an unsigned type?

本文关键字:long 返回 无符号 类型 use lt ptr shared gt count 为什么      更新时间:2023-10-16

shared_ptr 观察者 20.8.2.2.5 C++14 最终草案 (n4296(

   long use_count() const noexcept;

返回:与 *this 共享所有权的shared_ptr对象(包括*this(的数量,如果*this为空,则为 0。

[注:use_count()不一定有效。

根据此页面

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1450.html

对use_count的返回类型进行签名以避免陷阱,例如 p.use_count((> -1 计算结果为假。

参考

John Lakos,大型C++软件设计,第 9.2.2 节,第 637 页,Addison-Wesley,1996 年 7 月,ISBN 0-201-63362-0。

基本上,它看起来像一个保姆级的决定,为大一的软件开发人员量身定制。

原因是此类

计数器最合适的类型是常规signed整数,即使此计数器永远不会低于 0。

为什么要unsigned计数器?鉴于该语言unsigned当前真正含义,它不能成为否定的事实根本不是一个有效的借口。

unsigned 对于 C++并不意味着"不能为负数的整数"。要理解为什么这个定义根本没有意义,请考虑

  • 两个unsigned的区别是unsigned
  • 添加带signedunsignedunsigned
  • unsigned值永远不会大于 -1

如果您认为unsigned意味着"非负面",以上都没有任何意义。

unsigned用于size_t是一个错误(例如参见为什么size_t无符号?(,只是部分*可以原谅,因为在16位时代,一个额外的位被认为是值得的错误语义,unsigned类型在C++具有这种用途。

不幸的是,现在size_t错误无法修复(由于向后兼容性(,但为什么要在另一个不相关的领域重复同样的错误呢?

请注意,可能犯的大错误只是unsigned名称的选择(鉴于其真正含义(。如果该类型被命名(更合适(modulo那么可能会更明显地说明为什么对字符串的大小使用 modulo int 根本没有任何意义。

名称无关紧要,重要的是语义,unsigned只是对计数器或大小具有错误的语义。

(*(我个人认为即使在当时也是一个足够好的理由。如果 32767 现在对于一个尺寸来说还不够,那么 65535 很快就不够了。在我看来,对于这种语义的弯曲来说,仅仅一个位(值的两倍(并不是一个可接受的价格。

编辑

我发布了一个视频,其中我更详细地讨论了为什么我认为对size_t使用和无符号类型是C++的设计错误。

幻灯片可以从 http://raksy.dyndns.org/unsigned.pdf 下载