尽管关于模板化数字文字的用法有一个很好的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
。