uint32_t getmax()
{
return _vecContainer.size();
}
看起来很简单:我知道向量不能有负数个元素,因此返回无符号整数完全合理。
void setRowCol(const uint32_t &r_row; const uint32_t &r_col)
{
myContainer_t mc;
mc.row = r_row;
mc.col = r_col;
_vecContainer.push_back(mc);
}
再次强调,这很简单。
问题:
uint32_t foo(const uint32_t &r_row)
{
return std::min(r_row, _vecContainer.size());
}
这使我遇到了错误,例如:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:2589:1: note: candidate template ignored: deduced conflicting types for parameter '_Tp' ('unsigned long' vs. 'unsigned int')
min(const _Tp& __a, const _Tp& __b)
我做了很多调查,在一个平台上,vector::size_type 是一个8字节的数字。但是,按照设计,我使用的是无符号的4字节数字。这可能会导致问题出现,因为你不能从一个8字节的数字隐式转换为4字节的数字。
解决方法是老派的方式:
#define MIN_M(a,b) a < b ? a : b
return MIN_M(r_row, _vecContainer.size());
这很好用。但是系统性问题仍然存在: 在计划支持多个平台时,如何处理类似这样的情况?我可以使用size_t作为我的标准大小,但这会增加其他复杂性(例如在以后从支持64位数字的平台移动到支持32位数字的平台)。更大的问题是size_t是无符号的,所以我不能更新我的签名:
size_t foo(const size_t &r_row)
// bad, this allows -1 to be passed, which I don't want
有什么建议吗?
编辑:我曾经在某个地方读到size_t是有符号的,但后来被纠正了。目前看来这是我的设计限制(例如32位数字 vs 使用std::vector::size_type和/或size_t)。
std::vector
参考链接,您会发现size_type
通常是一个std::size_t
,其类型是实现特定的无符号整数。如果您需要表示非负大小的类型,则应该使用std::size_t
或对于容器,直接使用size_type
。 - Some programmer dudeint
。请参见 https://dev59.com/iWkw5IYBdhLWcg3wDWTL#10168569 - Christian Hacklint
并不是正确的答案。 即使在64位系统上,int
也经常是32位。 如果您正在处理char
,那么您实际上可以在内存中拥有超过2 ^ 31-1个char
,这会引起问题。 - Daniel Hsize_t
强制转换为有符号类型,ptrdiff_t
比int
更好。在 LP64 实现中,size_t
是 64 位,但int
是 32 位。据我所知,Google 建议使用ptrdiff_t
,然后检查结果是否为非负数,而 Microsoft 建议使用rsize_t
,然后检查结果是否低于某个最大值,以便检测环绕情况。 - Davislor