acosl不在std命名空间中?

8
根据cppreference,函数acosl应该在std名称空间中:https://en.cppreference.com/w/cpp/numeric/math/acos 然而,在使用gcc(或clang)时,下面的代码无法编译:
#include <cmath>                                                                 

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

我收到了以下错误消息:
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

我错过了什么?我是否误读了cppreference?

哪个版本的GCC?嗯,在GCC 4.9.2中似乎可以复现。 - Cory Kramer
1
我不确定发生了什么,但是acosl(4.0)std::acos(4.0l)都可以工作。此外,在Clang中添加-stdlib=libc++可以使std::acosl(4.0)正常工作。 - HolyBlackCat
@CoryKramer 我已经尝试过使用gcc-7、gcc-8和gcc-9。 - Manon
2
我认为这是GCC问题,或者至少是libstdc++问题。代码在使用libc++的clang 这里中运行良好。 - NathanOliver
1
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79700 - cpplearner
显示剩余2条评论
1个回答

4
这似乎是一个libstdc++的bug。
在libstdc++中,cmath不仅仅是在namespace std中包装了一个#include <math.h>:它定义了新的函数来委派执行内置功能。我猜需要在这个源代码中添加一个定义。当C++11(通过C99)引入该函数时,这可能只是一个疏忽。 (尽管请注意,acos(long double __x)重载委托给__builtin_acosl!)
在Clang中,切换到libc++可解决此问题。使用全局命名空间版本的acosl也应该可以解决在libstdc++中的问题。
您应该报告此bug。我认为这已经被bug#79700所覆盖。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接