回答:
C ++では、常にを使用するだけで十分std::abs
です。すべての数値型でオーバーロードされています。
Cでは、abs
整数でのみ機能しfabs
、浮動小数点値が必要です。これらは(すべてのCライブラリとともに)C ++で利用できますが、使用する必要はありません。
int
Cライブラリのバージョン、についてのオーバーロードがありlong
、float
、double
とlong double
。26.2.7項では、のオーバーロードも定義していcomplex
ます。
std::
そのまま使用したabs
場合、コードはWindowsでは期待どおりに動作しますがint
、Linuxではバージョンを使用するため、デバッグが非常に難しくなる可能性があります。
fabs
for double
とfloat
引数を使用しても問題ありません。これは、誤ってをstd::
オフにした場合でもabs
、浮動小数点入力の動作が同じになるようにするためです。
のabs
代わりにを使用する自分のミスのため、この問題のデバッグに10分を費やしましたstd::abs
。私はusing namespace std;
が推測するだろうと想定していましたがstd::abs
、そうではなく、代わりにCバージョンを使用していました。
とにかく、意図を明確に文書化する方法として、浮動小数点入力のfabs
代わりに使用するのが良いとabs
思います。
std::abs
常に(のC-バージョンではなく呼び出されるようだabs
呼び出すとき)abs
限りとしてusing namespace std;
でexplicatedされます始まり。これがコンパイラ固有かどうかはわかりません。
「abs」と「fabs」は、あいまいなオーバーロードメッセージなしで変換できる場合、C ++ float型に対してのみ同一です。
私はg ++(g ++-7)を使用しています。テンプレートの使用と合わせて、特にmprealを使用する場合、ハード「あいまいなオーバーロード」メッセージが表示される場合があります-abs(static_cast<T>(x))
。これが常に解決するとは限りません。absがあいまいな場合、fabsが期待どおりに動作している可能性があります。sqrtの場合、そのような単純なエスケープは見つかりませんでした。
数週間以来、私はC ++の「既存の問題ではない」に苦労しています。古いC ++プログラムをC ++ 14に更新して、以前よりも多くのテンプレートを使用できるようにしています。多くの場合、同じテンプレートパラメータは、実際の標準のfloat型、複合型、またはクラス型の場合があります。なぜこれまで、ロングダブルは他のタイプよりもいくぶん賢明に振る舞った。すべてが機能しており、以前にmprealを含めていました。次に、デフォルトの浮動小数点型をmprealに設定していて、大量の構文エラーが発生しました。これにより、たとえばabsとsqrtに対して、さまざまな解決策を求めて、何千ものあいまいなオーバーロードが発生しました。一部はオーバーロードされたヘルプ機能を必要としていましたが、テンプレートの外にありました。0.0Lと1.0Lの1000の使用法を、ZeroまたはOneまたはtype_castを使用した正確な定数タイプに個別に置き換える必要がありました-あいまいさのために自動変換定義は不可能です。
5月まで、暗黙的な変換の存在が非常に優れていることがわかりました。しかし、それがないとはるかに簡単になり、他の標準の定数型への安全な明示的なtype_castsを含む型保存定数を持つことになります。