包含<algorithm>和<limits>导致"invalid pure specifier"编译错误

Including <algorithm> and <limits> causes "invalid pure specifier" compilation error

本文关键字:gt lt pure specifier 错误 invalid 编译 limits algorithm 包含 导致      更新时间:2023-10-16

给定以下代码:

#include <algorithm>
#include <limits>
int main() {
    const char INFINITY = std::numeric_limits<char>::max();
    return 0;
}

如果我用g++编译它,我会收到以下错误:

$ g++ --std=c++11 test.cpp
test.cpp: In function ‘int main()’:
test.cpp:5:30: error: invalid pure specifier (only ‘= 0’ is allowed) before ‘::’ token
     const char INFINITY = std::numeric_limits<char>::max();
                              ^
test.cpp:5:58: error: function ‘const char __builtin_inff()’ is initialized like a variable
     const char INFINITY = std::numeric_limits<char>::max();

删除 #include <algorithm> 语句可解决此问题。

我的问题:这是一个错误还是这是预期的行为?

如果这是预期的行为,是否有一些我不知道的命名空间冲突规则?

G++ 版本:

gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.1)

INFINITY是由<limits>中的C和C++标准(或C的limits.h)定义的宏 - 它表示double的无穷大值(例如IEEE-754的0x7ff0000000000000)。通常,这被定义为编译器在代码生成的后期阶段用常量替换的"内置函数"。因此,相当奇怪的错误消息。而且由于宏只是原地扩展而没有命名空间等,因此不可能将名称INFINITY用于其他任何内容。