gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:10:17 25 4
gpt4 key购买 nike

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

最佳答案

Does anybody know why the template version of comparison doesn't throw warning?

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

The assertion failure is expected as the integer promotion

迂腐地说,这种转换不属于整数提升。

关于c++ - g++ 不会在模板代码中发出 -Wsign-compare,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57948813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com