Является ли fabsf частью пространства имен std в C ++ 11? - PullRequest
0 голосов
/ 03 января 2019

На странице 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, или на странице выше неправильно упоминать его как часть std в C ++ 11?

А если это не так в G ++, это исправлено в более поздних версиях?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Да, fabsf и все другие -f / -l функции из math.h являются частью пространства имен std через cmath в C ++ 11.Он был добавлен примерно в 2002 году, когда C ++ 0x был перебазирован поверх стандартной библиотеки C99, что позволило [c.math]/4 включить эти новые функции.

[c.math]/4

Содержимое этих заголовков совпадает с заголовками стандартной библиотеки C <math.h> и <stdlib.h> соответственно, со следующими изменениями:

(историческая справка: намерение добавить все -f/ -l варианты уже были очевидны в C ++ 03, см. LWG289 )

Однако таблица с содержимым cmath была пропущена до 2016 года, когда p0175r1 исправлены все такие таблицы, чтобы привести их в соответствие со стандартом.

p0175r1

Влияние на стандарт

Изменениеявляется чисто редакционной.

0 голосов
/ 03 января 2019

Похоже, cppreference неверно. Похоже, что это было добавлено для C ++ 17, поскольку оно было добавлено в черновик в 2016 году с заголовком [numerics] Apply P0175 (C Synopses), и мы видим, что p0175r1 действительно добавляет:

 float fabsf(float x);

Статус libc ++ не указывает состояние для p0175r1, поэтому это означает, что он еще не поддерживает эти изменения. Я не могу найти позицию для предложения на странице состояния libstdc ++ .

...