Sur la base de la discussion ici, j'ai a signalé un bogue aux développeurs Ubuntu.
Lors de la compilation de l'exemple de programme c ++ suivant:
#include <cmath>
#include <stdio.h>
int main()
{
printf("%f\n", std::cosf(0.0f));
}
Je reçois le message d'erreur suivant: error: ‘cosf’ is not a member of ‘std’
Comprenant math.h
et l'utilisation de la version sans espace de nom fonctionne très bien. Que se passe-t-il?
J'utilise g ++ 8.3.0-6ubuntu1 sur Ubuntu 19.04.
Je construis avec g++ --std=c++17 test.cpp
Cette version de la bibliothèque ( libstdc ++ 8 ) n'est pas entièrement conforme à C++ 17. L'avis de droit d'auteur indique qu'il a été mis à jour pour la dernière fois en 2016. En juin 2019, la dernière version en amont est buggé. Il a une section #if __cplusplus > 201402L
, Mais il ne déclare pas les identifiants requis par C++ 17. Il y a un rapport de bogue ouvert.
En regardant /usr/include/c++/8/cmath
Sur Ubuntu, il inclut <math.h>
, Indéfinit une série de macros pour ses fonctions (requises par la bibliothèque standard C) pour accéder à leurs noms, importe cos
, acos
, etc. dans l'espace de noms std::
, puis déclare les surcharges float
et long double
surchargées comme inline
.
Il ne déclare jamais cosf
dans l'espace de noms std::
, Même si C++ 17 le dit. Le norme C++ 11 dit , "Les noms définis comme fonctions en C doivent être définis comme des fonctions dans la bibliothèque standard C++" et "Chaque nom de la bibliothèque Standard C déclaré avec une liaison externe est réservé à l'implémentation pour être utilisé comme nom avec extern "C"
liaison, à la fois dans namespace std
et dans l'espace de noms global. " Cependant, il n'indique pas explicitement que std::expf
Et al. doit être pris en charge jusqu'à P0175r1 en juin 2016. Il s'agit apparemment d'un oubli.
La bibliothèque libc ++ les déclare, donc la compilation avec clang++ -std=c++17 -stdlib=libc++
Devrait fonctionner.