Для чего именно std:: labs()?

Я читал о функции std::abs() при просмотре cppreference.

На этой странице я также видел функцию std::labs(). Который имеет тот же самый прототип, что и одна из перегрузок std::abs() (одна для 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()?

Ответ 1

С++ 11 был, когда были добавлены std::labs и std::llabs. Это было частью частичной синхронизации с стандартной библиотекой С++ со стандартной библиотекой C99.

В коде С++ это действительно не нужно, потому что у нас была перегрузка long std::abs с тех пор как навсегда. Но если у вас есть код C (который по совпадению также компилируется с помощью компилятора С++), и он использует labs, вы можете создать его с помощью компилятора и стандартной библиотеки С++ 11.


В ретроспективе для этих функций существует один весьма полезный случай использования. И тогда попытка использования std::abs неоднозначна. Например:

template<typename T>
T run_func(T (&f)(T)) {
  return f({});
}

Тогда попытка вызова run_func(std::abs); плохо сформирована. Нам нужно либо явно указать аргумент шаблона, либо применить std::abs к соответствующему типу. С другой стороны, run_func(std::labs); не является двусмысленным и не слишком подробным.

Тем не менее, не слишком полезно.