J’ai lu à propos de la fonction std::abs()
lors de la navigation dans cppreference .
Sur cette page, j’ai également vu une fonction std::labs()
. Qui a le même prototype que l’une des surcharges std::abs()
(celle pour long
).
long abs( long n ); long labs( long n );
et
long long abs( long long n ); long long llabs( long long n );
Alors,
std::labs()
? std::labs()
? std::abs()
et std::labs()
? C ++ 11 était quand std::labs
et std::llabs
ont été ajoutés. Cela faisait partie de la synchronisation partielle effectuée sur la bibliothèque standard C ++ avec la bibliothèque standard C99.
Vous n’en avez pas vraiment besoin dans le code C ++, car nous avons eu une long
surcharge de std::abs
depuis à peu près toujours. Mais si vous avez du code C (qui, par pure coïncidence, comstack aussi avec un compilateur C ++), et qu’il utilise des labs
, vous pouvez le construire avec un compilateur C ++ 11 et une bibliothèque standard.
Rétrospectivement, il existe un cas d’utilisation marginalement utile pour ces fonctions. Et c’est quand une tentative d’utiliser std::abs
est ambiguë. Par exemple:
template T run_func(T (&f)(T)) { return f({}); }
Ensuite, essayez d’appeler run_func(std::abs);
est mal formé. Nous devons soit spécifier explicitement l’argument template, soit cast std::abs
au type approprié. D’autre part, run_func(std::labs);
n’est pas ambigu, et pas trop verbeux.
Pourtant, pas trop utile.