g ++不会在模板代码中发出-Wsign-compare

时间:2019-09-15 23:05:20

标签: c++ g++ gcc-warning g++4.8

我最近注意到,当有问题的代码位于函数模板中时,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.

1 个答案:

答案 0 :(得分:1)

  

有人知道为什么比较的模板版本不会发出警告吗?

在该版本的GCC中,这可能是一个错误(实现质量问题)。例如,GCC 5.5.0不会对示例程序发出诊断,因此该问题似乎已在更高版本中得到解决。

  

断言失败预期为整数提升

要学究,此转换未归为整数升级。