'cosf', 'sinf' и т.д. не входят в 'std'

Основываясь на обсуждении здесь, я сообщил об ошибке разработчикам Ubuntu.


При компиляции следующего примера программы c++:

#include <cmath>
#include <stdio.h>

int main()
{
    printf("%f\n", std::cosf(0.0f));
}

Я получаю следующее сообщение error: 'cosf is not a member of 'std ошибке: error: 'cosf is not a member of 'std

Включение math.h и использование версии без пространства имен работает нормально. Что здесь происходит?

Я использую g++ 8.3.0-6ubuntu1 в Ubuntu 19.04.

Я g++ --std=c++17 test.cpp с g++ --std=c++17 test.cpp

Ответы

Ответ 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++ должна работать.