3

取下面的代码

#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;
}

where 函数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在这种情况下可以强制输出警告?

4

1 回答 1

1

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

该错误已在此处跟踪(@jureslak 再次归档,但已标记为欺骗)并已解决。请参阅 GCC 10.1 (Godbolt) 的警告。

于 2020-05-15T09:12:42.423 回答