途川 (@litjohn) 在 cstdint 你的跨平台~ 中发帖
如果你使用 int64_t 代替 long long,你会惊喜的发现如下代码 CE 了:
int64_t a = 114514;
a = max(0ll, a - b);
并且你本地很可能非常正常。原因在于,Linux 下 long 类型(long int 与 unsigned long int)都是 64 位的,而 win 下这些是 32 位的(bitset 里有同样的坑)。int64_t 在 Linux 的某些标准库实现中可能被 define 为了 long int,而 0ll 的类型是 long long,会变成 long long int,这样就会模板实例化失败。
这个设计一方面是 Windows 和 Linux 系统设计的不统一,另一方面是 max 函数设计的缺陷。
总之小心这个东西爆炸。