C++为常量选择类型
C++ Picking a type for a constant
因此,在相当规则的基础上,我似乎发现我声明的某个常量的类型(通常是整数,但偶尔也会有其他东西,如字符串)在使用它的上下文中不是理想的类型,需要强制转换或导致编译器警告隐式强制转换。
例如,在一段代码中,我遇到了下面这样的问题,并遇到了一个有符号/无符号的比较问题。
static const int MAX_FOO = 16;
...
if (container.size() > MAX_FOO) {...}
我一直在考虑总是使用给定常量允许的最小/最基本类型(例如char、unsigned char、const char*等,而不是int、size_t和std::string),但我想知道这是否真的是个好主意,是否在某些地方可能是个坏主意?例如,使用"auto"关键字(或者模板)的代码的类型太小,并在看似安全的操作上溢出?
选择能够保存初始值的最小类型是一个坏习惯。这会导致溢出。
总是为最一般的情况编码(根据墨菲定律,这是最坏的情况)。随着模板的泛化,最坏的情况会变得更糟。当无符号类型在附近时,要为奇怪的溢出类型做好准备,避免负数。
出于你提到的原因,std::size_t
是任何东西的尺寸或长度的最佳选择。但是减去指针,得到的是std::ptrdiff_t
。就我个人而言,如果可以保证是正的,我建议将这种减法的结果转换为std::size_t
。
char *
不像std::string
那样拥有C++意义上的字符串,因此后者是更保守的选择。
这个问题太宽泛了,无法提出更具体的建议…
相关文章:
- 在C++中,如何通过几种类型从元组中选择多个元素
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 如何为我的数组选择更大的数据类型?
- 根据模板类型选择类模板的成员类型?
- 使模板函数按函数参数选择类型
- 重载模板函数未为特定类型选择正确的版本
- 在运行时选择类成员的类型
- 如何在不同类型的值之间进行选择以传递给多态函数?
- 函数模板 - 使用同一类型调用时,使用不同的参数类型选择函数
- 使用声明类型选择函数专业化
- 根据输入类型选择正确的结构方法
- 编译器如何知道为多态类型选择哪个函数
- 根据按键类型选择地图或unordered_map
- 为什么Qt不应用这个样式表类型选择器?
- 为输入类型选择模板输出类型
- 可变constexpr类型选择器
- 如何根据返回类型选择重载
- 基于模板的动态数据类型选择
- 增强如何为类型选择创建映射
- 可变模板参数:我可以根据类型选择引用还是值