我最近写了这个函数:
template<class T>
bool isAvailableSpace(int size, int capacity){
return capacity - size - sizeof(T) >= 0;
}
capacity
- 一些缓冲区的容量
size
- 使用的字节数。
该函数检查缓冲区中是否有足够的空间用于类型对象T
。问题原来是表达式的结果capacity - size - sizeof(T)
是无符号的,因为sizeof
. 所以函数总是返回true
。
实际上是一个问题:为什么会这样?表达式涉及有符号和无符号变量,为什么编译器优先考虑无符号变量?
由于它
size_t
是无符号类型,而是有符号类型,int
并且秩size_t
不小于 rankint
,因此从第8/11条标准的当前草案中可以看出,在这种情况下将执行整数提升(整数提升)并且表达式的结果将是一个无符号类型:一个小例子来演示:
在第一种情况下,表达式的类型
size_t
为无符号,即 情况与问题中描述的情况相似。在第二种情况下 - 排名unsigned short
小于排名int
和结果 -int
,即 标志类型。