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

ric*_*y m 23 c++ shared-ptr c++14

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

   long use_count() const noexcept;
Run Code Online (Sandbox Code Playgroud)

返回:共享所有权的shared_ptr对象数,或者为空时为0 .*this*this*this

[注意:use_count()效率不一定. - 结束说明]

AnT*_*AnT 20

根据这个页面

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

对use_count的返回类型进行了签名,以避免陷入诸如p.use_count()> -1评估为false的陷阱.

参考

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

基本上,它看起来像是为新生软件开发人员量身打造的保姆级决策.

  • Lakos的书非常好,可能是最能影响我的C++的书.一个规则是接口中没有无符号类型.这不是针对新生软件开发人员量身打造的"保姆级决策",这是关于如何扩展软件开发和保持可靠性的深层建议. (3认同)
  • 嗯...看起来像我的第三颗子弹. (2认同)
  • 一个易于使用的界面,他们在想什么? (2认同)

650*_*502 18

原因是这种计数器最合适的类型是一个常规signed整数,即使这个计数器永远不会低于0.

为什么一个柜台应该是unsigned?这不能成为否定的事实是不是在所有给定电流的有效借口真正意义上unsigned的语言.

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

  • 两者的区别unsignedunsigned
  • 添加unsigned一个signedunsigned
  • 一个unsigned值永远不会比大-1

如果你认为unsigned意思是"非负面" ,则上述任何一个都没有任何意义.

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

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

请注意,可能最大的错误就是选择名称unsigned(鉴于它的真正含义).如果这个类型已被命名(更合适),modulo那么为什么使用a modulo int作为字符串的大小根本没有任何意义可能会更明显.

这个名字是无关紧要的,重要的是语义,unsigned对于一个计数器或一个大小,它只是有错误的语义.

(*)即使在那时,我个人也认为这不是一个足够好的理由.如果现在32767对于一个大小来说还不够,那么65535真的不会很快.在我看来,只有一点(价值的两倍)不是这种语义弯曲的可接受的价格.

编辑

我已经发布了一个视频,我正在讨论更多细节,为什么我认为使用和无符号类型size_t是C++中的设计错误.

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

  • @ 6502:首先,Stroustrup有权获得他的意见,但他错了.其次,无论有哪些选择,很久以前就已做出决定.标准库大小/计数是未签名的.为什么地球上这个人突然签名确实不清楚.对计数/大小采用无符号类型与获取值​​范围的额外位无关. (8认同)
  • 这是一个咆哮,而不是答案.您的声明需要合理的理由,并为读者提供任何好处. (7认同)
  • 在经历了十多年的编程经验之后,我不会使用`unsigned`类型进行数学/逻辑运算,例如比较.我只在按位操作的情况下使用`unsigned`.由于从有符号到无符号的自动转换,它使我免于许多陷阱,导致`-1`变成一个非常大的值,例如. (6认同)
  • @ 6502:第三,无符号类型的性质与主导C和C++迭代器语义的开放闭合范围的性质一致.它始终存在于语言的核心中,并且无法避免.这不是某人的决定,而是世界的运作方式.所以,最初的错误实际上是推进*signed*类型 - 甚至在Stroustrup之前就犯了一个错误.签名类型属于特定于应用程序的域.编程本身是无符号的,无符号的和无符号的,并且很少签名. (4认同)
  • @janm:没有多少情况下单个数组(单个字节)需要占用超过一半的地址空间.甚至更少的情况下,你不能使用这种大小的多精度整数(例如`long`).利用这些案例来修改所有其他用例的规则,谴责未来几代程序员因为它而导致的愚蠢错误在我看来是一个值得怀疑的选择.当然,对于非负整数(具有正确的语义)有另一个整数类型可能会很好......但是`unsigned`不是那样的. (3认同)
  • @ JohannesSchaub-litb:两个`nonneg int`的区别应该是一个普通的`int`(当溢出时带有UB)或者可能是两个`nonneg int`的差异应该是常规的有符号整数类型,足以确保没有溢出发生. (2认同)