答案 0 :(得分:1)
答案 1 :(得分:1)
隐式转换的当前C ++规则使得无符号整数类型可用作 number 类型。典型的例子,string("hello").size() < -5"
是有保证的,这是愚蠢的 - 但不是只是愚蠢。浪费时间追踪涉及此类转换的微妙错误,更不用说试图选择完美匹配类型所浪费的时间,这表明它比一个虚构的例子中的愚蠢行为更严重;它与编程一样严重。
一个糟糕的解决方案是通过添加额外的比较来容纳草率的程序员,这些程序员直接比较签名到无符号。这很糟糕,因为C ++建立在为有能力的程序员提供服务的基础上,他们知道他们正在做什么,并且希望他们的代码和最终的机器代码之间尽可能少。比较有符号到无符号在当前C ++中具有简单明确定义的效果,而不是例如Java程序员可能会期待。
一个好的解决方案是让程序员改进,直接表达他或她想要的东西,而不是依靠神奇的隐形修复。
例如,表达意图的一种好方法是将size
操作的结果转换为签名类型,例如ptrdiff_t
,或者当不需要完全普遍性时,只需int
。
支持这一点的一个好方法是定义一个n_items
函数,如下所示:
using Size = ptrdiff_t;
template< class Container >
auto n_items( Container& c )
-> Size
{ return c.size(); }
以不支持例如std::list
可以使用end(c) - begin(c)
使其适用于没有专业化的原始数组。但我更喜欢单独的(1)专业化。像这样:
template< class Item, Size n >
auto n_items( Item (&)[n] )
-> Size
{ return n; }
免责声明:关闭袖口代码,不要被编制者的手接触。
1)从技术上讲,这是一个过载,而不是专业化。但我遵循标准化委员会前任秘书Pete Becker的术语负责人。即,让我们尽可能使用简单的描述性语言,并在必要时仅使用正式术语。