cmath error на MacOS c ++ 17: вызов abs неоднозначен - PullRequest
1 голос
/ 29 февраля 2020

Наличие этой ошибки при использовании c ++ 17 на ОС Ma c. Насколько я могу судить, код верен и должен работать нормально (компилируется без проблем с w / g ++ и clang ++ на linux). Кроме того, насколько я могу судить, текущая версия clang [10.0.1] ma c по умолчанию должна поддерживать c ++ 17 (полная распечатка информации о версии ниже).

Итак, мой вопрос: действительно ли это ошибка в моем коде, но она работает по счастливой случайности на linux? Или это проблема с MacOS Clang, например, не полная реализация C ++ 17?

Из cppref: Определено в заголовке (начиная с C ++ 17): int abs( int n ); Другие функции C ++ 17, похоже, работают совершенно нормально.

#include <cmath>
// #include <cstdlib> //works if included
int main() {
  int i = 1;
  // return std::abs(1); // Works fine
  return std::abs(i); // Fails
}

Скомпилируйте с: clang++ -std=c++17 test.cpp

Получите эту ошибку:

test.cpp:7:10: error: call to 'abs' is ambiguous
  return std::abs(i);
         ^~~~~~~~
/Library/Developer/CommandLineTools/usr/include/c++/v1/math.h:761:1: note:
      candidate function
abs(float __lcpp_x) _NOEXCEPT {return ::fabsf(__lcpp_x);}
^
(... etc.)
1 error generated.

Если вы #include <cstdlib>, она работает без ошибок. использование -std=gnu++17 или -std=c++1z также не устраняет проблему. В реальном коде (который, очевидно, является более сложным, чем описанный выше, и фактически использует функции c ++ 17), ошибка происходит в зависимости от порядка моих включаемых файлов. Я не могу повторить это в простом примере, но я предполагаю, что все сводится к вызову версии cstdlib вместо версии cmath.

В настоящее время мой «обходной путь» - просто поставить заголовок входит в порядок, который работает .. но это вряд ли долгосрочное решение.

Кто-нибудь знает причину?

Информация о версии (ошибка не указана c в этой версии MacOS, также происходит на ноутбуках моих студентов):

Bens-iMac:test ben$ clang++ -v
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

1 Ответ

1 голос
/ 29 февраля 2020

См. LWG Issue 2912

Это было исправлено в транке libc ++. Я не знаю, выпустила ли Apple это исправление. Как вы обнаружили, в том числе <cstdlib> это обходной путь.

...