J'ai lu à propos de la fonction std::abs()
lors de la navigation 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 de long
).
long abs( long n );
long labs( long n );
et
long long abs( long long n );
long long llabs( long long n );
Donc,
std::labs()
?std::labs()
?std::abs()
et std::labs()
?C++ 11 était lorsque std::labs
Et std::llabs
Ont été ajoutés. Cela faisait partie de la synchronisation partielle effectuée avec 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 surcharge de long
de std::abs
Depuis presque toujours. Mais si vous avez du code C (qui, par pure coïncidence, se compile également avec un compilateur C++) et qu'il utilise labs
, vous pouvez le créer 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<typename T>
T run_func(T (&f)(T)) {
return f({});
}
Ensuite, essayer d'appeler run_func(std::abs);
est mal formé. Nous devons spécifier explicitement l'argument du modèle ou convertir std::abs
En type approprié. D'un autre côté, run_func(std::labs);
n'est pas ambigu et pas trop verbeux.
Pourtant, pas trop utile.