【问题标题】:std::span.size() vs array/vector sizestd::span.size() 与数组/向量大小
【发布时间】:2018-05-18 14:50:46
【问题描述】:

我们在工作中使用std::span()(目前使用 gsl 实现)。最近我们发现将std::span.size()vector.size() 进行比较得到-Wsign-compare error

if( span.size() > vector.size() ) // comparison between signed and unsigned integer expressions [-Wsign-compare]

我认为我们不想对这些比较中的每一个进行强制转换。我们的编码指南将这些警告视为错误。想知道是否有人有任何想法或建议?

【问题讨论】:

  • 这很不幸。截至目前span.size() 返回index_type 这是一个ptrdiff_t。要让std::dynamic_extent 工作,签名大小是必要的。你可能不得不投。老实说,更好的解决方案是将其设置为 size_t(-1),就像 std::string::npos 一样。
  • 我的项目使用了一个自制的signed_castunsigned_cast 进行符号转换,如果无法进行转换,将抛出。保持相同的大小。因此,例如,带有signed_cast(us) 的无符号短 us 变为有符号短(例如,16 位短),如果介于 0x8000 到 0xFFFF 之间,则会抛出异常。也许这样的东西适合你的目的?
  • 最近 (github.com/microsoft/GSL/commit/…) gsl::span 与 C++20 std::span 对齐,现在 size() 返回 size_t,而不是 ptrdiff_t

标签: c++ cpp-core-guidelines


【解决方案1】:

您可以使用迭代器并同时使用函数std::distance()

if (std::distance(s.begin(), s.end()) > std::distance(v.begin(), v.end()))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多