为什么g ++ 4.9.0默认有std :: isnan?

JET*_*ETM 0 c++ g++ c++11 g++4.9

我的理解是该功能std::isnan仅从C++ 11开始提供.此外,除非特别说明,否则g++使用-std=gnu++98.

那为什么这会编译?

>> cat test.cpp
#include <cmath>
int main(int argc, char** argv)
{
    return std::isnan(0);
}

>> g++ test.cpp
Run Code Online (Sandbox Code Playgroud)

是否有一个标志来取出该功能<cmath>

Yak*_*ont 5

编译器开发人员很难完全删除只能在下一版标准中使用的每个功能,特别是当相关库(C99)同时拥有它时.

实用程序(保护代码实际上遵循特定的标准)不足以使编译器编写者极其努力地使他们的编译器提供该服务.

相反,通常会发生的是新功能是在特定的标准标志下实现的.有时他们会被意外地向后移植.当标准最终确定时,部分实现会存在一段时间,直到它变得足够好.

然后开始下一版标准的工作.下一个版本标志为您提供了一个不太稳定的开发环境,因为尝试了新功能并将其丢弃和更改.

它投入了一些努力而不是向后移动,但它并不是一个显而易见的东西.