С++: использование std::sin(x) vs sin(x)

В чем разница между использованием стандартного разрешения области видимости для методов cmath и его неиспользованием?

#include <cmath>
double a = std::atan(0);

vs.

#include <cmath>
double a = atan(0);

Причина, по которой я спрашиваю, заключается в том, что я создаю собственный статический метод «атан», и при вызове его из статического метода он явно конфликтует с именем самого статического метода. Итак, здесь я избегаю конфликта, используя 'std::', но это заставляет меня задуматься о том, что происходит под капотом.

Заголовочный файл:

class MathCustom
{
public:
  static double atan(int x, int y);
};

СРР-файл:

#include <cmath>

double MathCustom::atan(int x, int y)
{
  if (x == 0 && y == 0) { return 0; } // undefined angle, but will be set to 0;
  if (x == 0) { // y != 0
    return (y > 0) ? std::atan(INFINITY) : std::atan(-INFINITY);
  } else { // x != 0 && y: any value
    return std::atan(static_cast<double>(y) / static_cast<double>(x));
  }
}

Оценил!


person Michel H    schedule 18.03.2021    source источник
comment
Второй может скомпилироваться, а может и не скомпилироваться. Вам нужно включить math.h или использовать using для переносимого использования atan без std::.   -  person Marc Glisse    schedule 18.03.2021
comment
Вы можете добавить свое собственное пространство имен или использовать ::atan, чтобы принудительно использовать atan, определенное в вашем файле.   -  person erip    schedule 18.03.2021
comment
Не по теме (может пригодиться когда-нибудь): вы можете избежать конфликта, явно указав глобальную область видимости (a = ::atan(x);)   -  person IWonderWhatThisAPIDoes    schedule 18.03.2021
comment
::atan имеет наименьшие шансы на успех, так как глобальный (C-совместимый) atan может быть макросом.   -  person rustyx    schedule 18.03.2021
comment
Второй не компилируется на моей машине, потому что atan не входит в глобальное пространство имен. Добавление using std::atan; до этого позволит скомпилировать его. Добавление #include <math.h> должно разрешить его компиляцию (но не на моей машине, поскольку я намеренно не добавляю заголовочные файлы C в системный путь включения компилятора).   -  person Eljay    schedule 19.03.2021
comment
Я предлагаю использовать std::numeric_limits<double>::infinity() вместо INFINITY   -  person phuclv    schedule 19.03.2021