Ответ 1
Эта версия библиотеки (libstdc++ 8) не полностью соответствует c++ 17. В уведомлении об авторском праве говорится, что в последний раз оно обновлялось в 2016 году. По состоянию на июнь 2019 года, последняя версия вышестоящей версии содержит ошибки У него есть #if __cplusplus > 201402L
, но он не объявляет идентификаторы, требуемые c++ 17. Есть открытый отчет об ошибке.
Глядя на /usr/include/c++/8/cmath
в Ubuntu, он включает в себя <math.h>
, определяет серию макросов для своих функций (необходимых для стандартной библиотеки C) для доступа к их именам, импортирует cos
, acos
и т.д. в пространство имен std::
, а затем объявляет перегруженный float
и long double
перегрузки как inline
.
Он никогда не объявляет cosf
в пространстве имен std::
, хотя c++ 17 говорит, что так и будет. Стандарт c++ 11 гласит: "Имена, которые определены как функции в C, должны быть определены как функции в стандартной библиотеке c++", и "Каждое имя из библиотеки Standard C, объявленной с внешней связью, зарезервировано для реализации для используйте в качестве имени с extern "C"
связью extern "C"
, как в namespace std
и в глобальном пространстве имен. " Тем не менее, он явно не заявляет, что std::expf
et al. должна быть поддержана до P0175r1 в июне 2016 года. Это, очевидно, было упущением.
Библиотека lib c++ объявляет их, поэтому компиляция с clang++ -std=c++17 -stdlib=libc++
должна работать.