acosl não está no espaço de nome std?


8

De acordo com cppreference, a função acosldeve estar no namespace std: https://en.cppreference.com/w/cpp/numeric/math/acos

No entanto, com o gcc (ou clang), o código abaixo não compila:

#include <cmath>                                                                 

int main()                                                                       
{                                                                                
        long double var = std::acosl(4.0);                                      
        return 0;                                                                
}

Eu recebi a seguinte mensagem de erro:

gay@latitude-7490:~$ g++ -std=c++11 test.cpp
test.cpp: In function 'int main()':
test.cpp:5:26: error: 'acosl' is not a member of 'std'; did you mean 'acosh'?
    5 |  long double truc = std::acosl( (long double)4.0);
      |                          ^~~~~
      |                          acosh

O que estou perdendo ? Estou interpretando mal a preferência?


Qual versão do GCC? Hmm parece reproduzível no GCC 4.9.2
CoryKramer

@CoryKramer 9.2 e trunc falham. acoslsem std::sucesso.
Ted Lyngmo

1
Eu não tenho certeza do que está acontecendo, mas ambos acosl(4.0)e std::acos(4.0l)fazer o trabalho. Além disso, adicionar -stdlib=libc++faz std::acosl(4.0)funcionar em Clang.
HolyBlackCat 9/03

2
Eu acho que esse é um problema do GCC, ou pelo menos um problema do libstdc ++. O código funciona bem com clang aqui, que usa libc ++
NathanOliver

Respostas:


4

Este parece ser um bug do libstdc ++.

cmathO libstdc ++ não envolve apenas um #include <math.h>in namespace std: ele define novas funções que delegam aos built-ins. Eu acho que uma definição quer adicionar a este código fonte . Provavelmente foi apenas uma supervisão quando o C ++ 11 (via C99) introduziu a função. (Observe que a acos(long double __x)sobrecarga delega para __builtin_acosl!)

No Clang, a mudança para libc ++ resolve o problema. Com libstdc ++, o uso da versão global do namespace acosltambém deve funcionar.

Você deve criar um bug . Eu acho que é coberto pelo bug # 79700 .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.