gcc不会警告比较无符号整数<0,即使已启用Wextra,也是如此

问题描述 投票:3回答:1

采用以下代码

#include <iostream>

template<typename T>
T f(T x, unsigned y) {
    if (y < 0) return x;
    return static_cast<T>(0);
}

using namespace std;

int main() {

    int a = f(2, 3);
    std::cout << a << std::endl;

    return 0;
}

其中f函数始终总是返回0。使用g++-7.2.0 -Wall -Wextra对其进行编译不会提示无意义的比较。但是,clang会很好地警告我们:

a.cpp:7:11: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare]
    if (y < 0) return x;
        ~ ^ ~
1 warning generated.

为什么这样(我认为模板是问题的根源,在这种情况下可以强制gcc输出警告吗?

c++ g++ compiler-warnings gcc-warning gcc7
1个回答
0
投票

这是某些GCC版本中的回归错误(包括8.x和9.x-在撰写本文时,它们仍是许多发行版中的默认编译器)。

已对该错误进行了跟踪here(再次将它@jureslak归档,但被标记为重复),并已解决。 See the warning with GCC 10.1(Godbolt)。

© www.soinside.com 2019 - 2024. All rights reserved.