表示模板化负数字面值的首选方式

Preferred way of expressing templated negative numeric literals

本文关键字:方式 字面值 数字 表示      更新时间:2023-10-16

虽然有一个关于模板化数字字面值使用的好问题,但它没有提到数字字面值为负值的情况。

应该选择哪种变体,为什么?

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