首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在C++20中引入std::ssize()?

为什么在C++20中引入std::ssize()?
EN

Stack Overflow用户
提问于 2019-05-20 16:46:28
回答 2查看 9.2K关注 0票数 106

C++20引入了免费的std::ssize()函数,如下所示:

代码语言:javascript
复制
template <class C>
    constexpr auto ssize(const C& c)
        -> std::common_type_t<std::ptrdiff_t,
                              std::make_signed_t<decltype(c.size())>>;

一种可能的实现似乎是使用static_cast,将类C的size()成员函数的返回值转换为其有符号的副本。

既然C的size()成员函数总是返回非负值,为什么还要把它们存储在有符号变量中呢?如果有人真的想这样做,这只是一个简单的static_cast问题。

为什么在C++20中引入std::ssize()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-20 16:49:58

this paper中描述了其基本原理。引用一句话:

在C++17中采用span时,它同时使用带符号整数作为索引和大小。这在一定程度上是为了允许使用"-1“作为标记值,以指示其大小在编译时未知的类型。但是让一个STL容器的size()函数返回一个带符号的值是有问题的,所以引入了P1089来“修复”这个问题。它得到了多数人的支持,但没有达到达成共识所需的2比1的优势。

本文P1227建议添加非成员std::ssize和成员ssize()函数。包含这些将使某些代码更直接,并允许在大小计算中避免不想要的无符号。这个想法是,如果通过std::ssize()和作为成员函数使ssize()可用于所有容器,则对P1089的抵抗力将会降低。

票数 77
EN

Stack Overflow用户

发布于 2019-05-20 18:18:05

来自Eric Niebler的stolen

当第一次设计STL时,

'Unsigned types signal that a negative index/size is not sane'是最流行的智慧。但从逻辑上讲,事物的计数不一定是正数。我可能希望在有符号整数中保留一个计数,以表示添加到集合或从集合中删除的元素的数量。然后我想把它和集合的大小结合起来。如果集合的大小是无符号的,那么现在我不得不混合使用有符号和无符号的算法,这就是一个bug农场。编译器对此发出警告,但由于STL的设计很大程度上迫使程序员陷入这种情况,因此该警告非常常见,以至于大多数人将其关闭。这是一种遗憾,因为它隐藏了真正的bug。

在接口中使用无符号整数并不像许多人认为的那样有好处。如果用户意外地向API传递了一个轻微的负数,它会突然变成一个巨大的正数。如果API将数字作为有符号的,那么它可以通过断言数字大于或等于零来检测情况。

如果我们将无符号整数的使用限制为位旋转(例如,掩码),而在其他任何地方使用有符号整数,则错误发生的可能性较小,并且更容易检测到错误发生的时间。

票数 55
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56217283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档