尽管关于模板化数字文字的用法有一个很好的question,但没有提及数字文字为负值的情况。

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


template <typename T>
T expr(T x)
{
    constexpr T scale = T(-9.0);
    return x * scale;
}

B
template <typename T>
T expr(T x)
{
    constexpr T scale = -T(9.0);
    return x * scale;
}

最佳答案

假设您只是在谈论算术类型(否则operator-可能会被重载以做一些奇怪的事情)...

它们对所有算术类型都产生相同的结果,但最大负值除外(请参见下文),但是 较为传统,不太可能使人们感到困惑。仅此一个原因就足以让我更喜欢

可以用于该类型的整个值范围,但是 B 不能,例如

short a = short(-32768);
assert( a == -32768 );
short b = -short(32768);
assert( b == -32768 );  // FAIL!

这是因为32768并不是一个有效值,因此无法通过否定(short)-32768来产生值(short)32768

09-06 21:16