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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (35)

C ++ 20引入了std::ssize()免费功能如下:

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,将size()cl ass C的成员函数的返回值转换为其签名对应项。

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

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

提问于
用户回答回答于

理由在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1227r1.html中描述。报价:

当span被采用到C ++ 17中时,它使用有符号整数作为索引和大小。部分原因是允许使用“-1”作为标记值来指示在编译时其大小未知的类型。但是有一个STL容器,其size()函数返回一个有符号值是有问题的,所以P1089被引入来“修复”这个问题。它获得了多数支持,但没有达成共识所需的2比1的利润。 本文P1227是一个添加非成员std :: ssize和成员ssize()函数的提议。包含这些将使某些代码更加直接,并允许在大小计算中避免不需要的无符号。如果ssize()通过std :: ssize()和成员函数可用于所有容器,那么对P1089的抵抗会减少。

用户回答回答于

无意中从Eric Niebler偷走了:

'Unsigned types signal that a negative index/size is not sane'是STL最初设计时的流行智慧。但从逻辑上讲,事情的数量不一定是积极的。我可能希望在有符号整数中保留计数,以表示添加到集合或从集合中删除的元素数。然后我想把它与集合的大小结合起来。如果集合的大小是无符号的,那么我现在被迫混合有符号和无符号算术,这是一个bug场。编译器对此提出警告,但由于STL的设计几乎迫使程序员进入这种情况,因此警告很常见,以至于大多数人都将其关闭。这是一种耻辱,因为这隐藏了真正的错误。 在接口中使用无符号整数并不是许多人认为的恩惠。如果用户意外地将略微负数传递给API,它会突然变成一个巨大的正数。如果API将数字作为签名,那么它可以通过断言数字大于或等于零来检测情况。 如果我们将无符号整数的使用限制为比特(例如,掩码)并在其他地方使用有符号的整数,则错误发生的可能性较小,并且在发生错误时更容易检测。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励