signed char に対する単項演算子
以前 int16_t
に対する +=
とかでもハマったんだが、
符号を反転させる単項演算子 -
とかでも int
への格上げが起きるようで
template <typename T> T my_abs(T n) { return ((n >= 0) ? n : -n); }
みたいなコードは T
が signed 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)); }