【发布时间】:2016-09-17 18:30:03
【问题描述】:
我写了以下代码:
void foo(int& x)
{
bool b1 = (&x) == nullptr;
bool b2 = &x == nullptr;
int* ptr = &x;
bool b3 = ptr == nullptr;
}
对于上面的代码,我收到以下错误:
对于 b1 变量:
test.cpp:5:21:警告:与 NULL [-Wnonnull-compare] 比较的非空参数“x”
对于 b2 变量:
test.cpp:6:19: 警告:编译器可以假设‘x’的地址永远不会是NULL [-Waddress]
test.cpp:6:19: 警告:与 NULL [-Wnonnull-compare] 比较的非空参数“x”
并且没有针对 b3 的警告。
我理解为什么编译器会返回一个警告,'x' 永远不会是 NULL。但是我不明白为什么只为 b2 而不是 b1 返回此警告。
另外,我真的不明白它是什么意思,'&x' 是一个非空参数。这是否意味着,指向引用的指针不是 T* 类型,但它有一个特殊类型,可以强制转换为 T*?
如果有关系,我使用编译器 g++ (GCC) 6.2.1
感谢您的所有提示。
【问题讨论】:
-
我没有这些警告,你试过用 b1 换行和用 b2 换行吗?
-
我猜因为这只是一个有用的警告并且不是常见的情况,所以 gcc 没有非常先进的规则来产生警告并且它被额外的间接级别混淆了由中间变量提供。
-
@DominiqueLorre 是的,我尝试交换它们,但结果相同。
-
g++ -c foo.cc -std=gnu++0x -Wall foo.cc: In function ‘void foo(int&)’: foo.cc:6:8: warning: unused variable ‘b1’ [-Wunused-variable] bool b1 = (&x) == nullptr; ^ foo.cc:7:8: warning: unused variable ‘b2’ [-Wunused-variable] bool b2 = &x == nullptr; ^ foo.cc:9:8: warning: unused variable ‘b3’ [-Wunused-variable] bool b3 = ptr == nullptr; -
你的 g++ 版本是多少?当然,我没有发布未使用变量警告,因为它们与真正的问题无关