cppreference を参照するときにstd::abs()
関数について読みました。
そのページには、std::labs()
関数もあります。 std::abs()
オーバーロードの1つ(long
のオーバーロード)と同じプロトタイプを持っています。
_long abs( long n );
long labs( long n );
_
そして
_long long abs( long long n );
long long llabs( long long n );
_
そう、
std::labs()
は何をしますか?std::labs()
はどこでいつ使用しますか?std::abs()
とstd::labs()
の違いは何ですか?C++ 11では、_std::labs
_および_std::llabs
_が追加されました。これは、C++標準ライブラリとC99標準ライブラリとの部分的な同期の一部でした。
ほぼ永遠に_std::abs
_のlong
オーバーロードがあったため、C++コードでは本当に必要ありません。ただし、Cコード(偶然にもC++コンパイラでコンパイルされるコード)があり、labs
を使用している場合は、C++ 11コンパイラと標準ライブラリでビルドできます。
振り返ってみると、これらの機能にはわずかに役立つユースケースが1つあります。そして、それは_std::abs
_を使用する試みがあいまいなときです。例えば:
_template<typename T>
T run_func(T (&f)(T)) {
return f({});
}
_
run_func(std::abs);
を呼び出そうとするのは不正です。テンプレート引数を明示的に指定するか、_std::abs
_を適切な型にキャストする必要があります。一方、run_func(std::labs);
は曖昧ではなく、冗長すぎません。
それでも、too有用ではありません。