signed char に対する単項演算子

以前 int16_t に対する +=  とかでもハマったんだが、 符号を反転させる単項演算子 - とかでも int への格上げが起きるようで

template <typename T>
T my_abs(T n) {
  return ((n >= 0) ? n : -n);
}

みたいなコードは Tsigned char とかのときはコンパイルが通らない (コンパイルオプションが -Werror=conversion かそれ相当になっている時)。 なお、 error 自体は三項演算子? のところで出ているような表示になるので注意 (clang の場合)。

template <typename T>
T my_abs(T n) {
  return ((n >= 0) ? n : static_cast<T>(-n));
}

こうすれば通るが微妙にカッチョ悪いよなぁ…。

ちなみに std::abs() を使わず車輪の再発明したのは 実際には下記のように constexpr function にしたかったため。

template <typename T>
constexpr T my_abs(T n) {
  return ((n >= 0) ? n : static_cast<T>(-n));
}