我最近注意到,当有问题的代码位于函数模板中时,g ++不会发出有符号/无符号比较警告。这是一个示例:
// signed_unsigned.cc
#include <cassert>
#include <string>
template<typename T, typename U>
bool compare(T t, U u) {
return t >= u;
}
int main(int argc, char** argv)
{
size_t x = strtoul(argv[1], 0, 0);
int y = strtol(argv[2], 0, 0);
// bool chk = (x >= y); // if I use this statement instead, it throws [-Wsign-compare] warning
bool chk = compare(x, y);
assert(chk);
return 0;
}
我正在像这样编译和执行它:
$ g++ -std=gnu++11 signed_unsigned.cc -Wall -Wsign-compare
$ ./a.out 0 -5
a.out: signed_unsigned.cc:15: int main(int, char**): Assertion `chk' failed.
Aborted (core dumped)
断言失败是可预期的,因为整数提升会将-5转换为非常大的无符号值。但是汇编应该对此比较发出警告,不是吗?
我在这里可能缺少一些基本的知识,但是我在网上搜索了却找不到任何相关信息。有人知道为什么比较的模板版本不会发出警告吗?
使用的GCC版本:
$ g++ --version
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
答案 0 :(得分:1)
有人知道为什么比较的模板版本不会发出警告吗?
在该版本的GCC中,这可能是一个错误(实现质量问题)。例如,GCC 5.5.0不会对示例程序发出诊断,因此该问题似乎已在更高版本中得到解决。
断言失败预期为整数提升
要学究,此转换未归为整数升级。