web-dev-qa-db-ja.com

std :: labs()の正確な理由は何ですか?

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()の違いは何ですか?
46
msc

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有用ではありません。

62
StoryTeller