我最近写了这个函数:
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,即 标志类型。