gpt4 book ai didi

c++ - 比较对 int 和 unsigned 的引用时发出警告,但如果将 const(无引用)与 g++/msvc 进行比较则没有警告

转载 作者:行者123 更新时间:2023-11-28 02:01:55 30 4
gpt4 key购买 nike

所以我正在写 doctest图书馆,它应该是无警告的。

我最近注意到,在我的 CHECK() 宏中编写的代码在没有警告的情况下进入 if 语句会造成问题。

例如:if(0u == 0) 不会导致警告,但 CHECK(0u == 0); 会。

我调查了一下,部分原因是CHECK()宏背后有模板和表达式分解以及常量引用捕获。

我的问题是 3:

  1. 鉴于这 3 个片段 - 为什么会发生这种情况?

发出警告:

int a = 0;
unsigned b = 0;
if(a == b)

不发出警告:

const int a = 0;
const unsigned b = 0;
if(a == b)

发出警告:

const int& a = 0;
const unsigned& b = 0;
if(a == b)
  1. 我该如何应对?显然,我可以在库头中的模板周围使用 #pragma diagnostic 并消除这些警告,但这是不正确的。

原因是如果下面的代码给出警告:

int a = 0;
unsigned b = 0;
if(a == b)

那么下一段代码也应该给出一个警告:

int a = 0;
unsigned b = 0;
CHECK(a == b);
  1. 关于 const noref 案例,我是否遗漏了什么?因为昨天我发了this这个问题看起来非常相似......是否有其他情况会因为我的模板中的 const 引用捕获而咬我的屁股?

我认为编译器或优化级别不重要 - 我已经尝试了几个版本的 g++/MSVC(/W4 for msvc 和 -Wall -Wextra -pedantic + 50 more 对于 g++) 并且 clang 可能做同样的事情...

编辑:

以下代码使用 g++ 产生了警告,但使用 msvc 则没有... (-Wsign-conversion)

const int a = -1;
const unsigned b = 0;
if(a == b)

最佳答案

通常 unsigned int 可以表示比 int 更大的值。虽然您可以将 unsigned int 转换为 int,但在某些情况下会失败。例如,在 2 补码表示法中,-1 被转换为 unsigned int 中的最大数字(假设两者都使用相同大小的容器/寄存器)。

注意当你使用const引用时也是如此,因为有些引用可以在运行时初始化。例如,当你说一个函数在其参数中有 const 引用时。您只会在调用时知道它的值。

另一方面,const intconst unsigned int 的值在编译时已知。编译器知道如何从 which other 转换并且没有副作用,所以不需要警告。

如何应对这种情况?只需使用它们之间相等的类型。如果你真的想使用不同的类型并知道副作用,你可以告诉编译器你知道你在做什么并进行强制转换 (static_cast)。

关于c++ - 比较对 int 和 unsigned 的引用时发出警告,但如果将 const(无引用)与 g++/msvc 进行比较则没有警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39106893/

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