【发布时间】: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_cast和unsigned_cast进行符号转换,如果无法进行转换,将抛出。保持相同的大小。因此,例如,带有signed_cast(us)的无符号短us变为有符号短(例如,16 位短),如果介于 0x8000 到 0xFFFF 之间,则会抛出异常。也许这样的东西适合你的目的? -
最近 (github.com/microsoft/GSL/commit/…)
gsl::span与 C++20std::span对齐,现在size()返回size_t,而不是ptrdiff_t。