fabsf 是 C++11 中标准命名空间的一部分吗?

Is fabsf part of the std namespace in C++11?

本文关键字:一部分 命名空间 标准 C++11 fabsf      更新时间:2023-10-16

https://en.cppreference.com/w/cpp/numeric/math/fabs 页面提到std::fabsf自 C++11 起可用。但是,当我使用G ++ 6.3.0编译即使是使用std::fabsf的最简单程序时,它说fabsf不是std的成员。

#include <cmath>
int main()
{
    return (int)std::fabsf(0.0f);
}

哪一个是对的?G++ 6.3.0 没有将其包含在 std 中是错误的,还是上面的页面在 C++11 中将其作为std的一部分提及是错误的?

如果是 G++ 是错误的,那么在以后的版本中会修复吗?

是的,math.h 中的 fabsf 和所有其他 -f/-l 函数都是通过 C++11 中的 cmath std命名空间的一部分。它是在2002年左右添加的,当时C++0x重新基于C99标准库,这使得[c.math]/4包含这些新功能。

[c.math]/4

这些标头的内容分别与标准 C 库标头<math.h><stdlib.h>相同,但进行了以下更改:

(历史注释:添加所有-f/-l变体的意图在 C++03 中已经很明显,请参阅 LWG289)

然而,列出cmath内容的表格直到2016年才被忽略,当时P0175R1固定了所有此类表格,使其符合标准。

p0175r1

对标准的影响

这一变化纯粹是社论。

看起来 cpp 首选项不正确。这似乎是为 C++17 添加的,因为它在 2016 年以标题[numerics] Apply P0175 (C Synopses)添加到草案中,我们可以看到 p0175r1 确实添加了:

 float fabsf(float x);

libc++ 状态不表示p0175r1的状态,因此表明它尚不支持这些更改。我在 libstdc++ 状态页面中找不到提案的行项目。