表示模板化负数字面值的首选方式
Preferred way of expressing templated negative numeric literals
虽然有一个关于模板化数字字面值使用的好问题,但它没有提到数字字面值为负值的情况。
应该选择哪种变体,为什么?
template <typename T>
T expr(T x)
{
constexpr T scale = T(-9.0);
return x * scale;
}
template <typename T>
T expr(T x)
{
constexpr T scale = -T(9.0);
return x * scale;
}
我更喜欢A而不是b。
选项A对类型的假设比B少,因为一元-
可能不能很好地定义所有类型(例如溢出条件等,但对于数字字面值是可以的)。这对眼睛来说更容易一些。
当然,这个问题是针对数值类型的,所以两者都可以。
假设你只是在谈论算术类型(否则operator-
可能被重载来做一些奇怪的事情)…
它们对所有算术类型产生相同的结果,除了最负的值(见下文),但是A更传统,更不容易混淆。仅这一点就足以让我更喜欢A。
A可用于该类型的整个值范围,但B不能,例如
short a = short(-32768);
assert( a == -32768 );
short b = -short(32768);
assert( b == -32768 ); // FAIL!
这是因为32768不是一个有效的值,所以没有办法通过否定(short)32768
来产生值(short)-32768
。
相关文章:
- VB6和c++布尔字面值
- 为什么添加两个字符串字面值不使用操作符+
- 在编译时定义字符串/char字面值
- c++的字符串字面值如何存储在内存中?
- 为什么可以向字符串字面值添加整数?
- 用户定义字面值如何与数字分隔符一起使用
- 可修改字符串字面值的用例
- c++ constexpr vs宏,字符串字面值vs整数
- 字符串对字符串字面值的优化不够
- 是否有可能合法地重载字符串字面值和const char*
- UnicodeString /字符串字面值vs十六进制值
- 为什么将指针的内容修改为字符串字面值是错误的?
- 可变char模板的用户定义字面值
- c++: Std::cout缓冲区错误?对字符串变量和字符串字面值使用std::cout导致输出混乱
- 不能定义用户定义的字面值
- C/ c++预处理器中的宏参数字符串化为宽字符串字面值
- 如何在c++中编写八进制浮点字面值
- 是否有可能获得包含字面值的字符串的长度
- 试图对初始化为字符串字面值的char指针的未定义行为进行推理
- 如何从字符串字面值初始化无符号字符数组