【发布时间】:2016-08-23 16:58:49
【问题描述】:
所以我正在编写 doctest 库,它应该没有警告。
我最近注意到,在我的 CHECK() 宏中编写时,在没有警告的情况下进入 if 语句的代码会导致问题。
例如:if(0u == 0) 不会引起警告,但 CHECK(0u == 0); 会。
我调查了一下,部分原因是CHECK()宏后面有模板和表达式分解和const引用捕获。
我的问题是 3:
- 鉴于这 3 个 sn-ps - 为什么会发生这种情况?
给出警告:
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)
- 我该如何解决这个问题?显然,我可以在库标题中的模板周围使用
#pragma diagnostic并消除这些警告,但这不正确。
原因是如果下面的代码给出警告:
int a = 0;
unsigned b = 0;
if(a == b)
那么下一段代码也应该给出警告:
int a = 0;
unsigned b = 0;
CHECK(a == b);
- 我对 const noref 案例有什么遗漏吗?因为昨天我发布了this 的问题,这似乎非常相似......是否还有其他案例会因为我的模板中的 const 引用捕获而让我大吃一惊?
我不认为编译器或优化级别很重要 - 我已经尝试了几个版本的 g++/MSVC(/W4 用于 msvc 和 -Wall -Wextra -pedantic + 50 more 用于 g++)并且可能 clang 也这样做...
编辑:
以下代码使用 g++ 产生了警告,但没有使用 msvc... (-Wsign-conversion)
const int a = -1;
const unsigned b = 0;
if(a == b)
【问题讨论】:
标签: c++ visual-c++ g++ compiler-warnings