指向引用的指针的非空比较警告

时间:2016-09-17 18:30:03

标签: c++ g++

我写了以下代码:

void foo(int& x)
{
  bool b1 = (&x) == nullptr;
  bool b2 = &x == nullptr;
  int* ptr = &x;
  bool b3 = ptr == nullptr;
}

对于上面的代码,我遇到以下错误:

对于b1变量:

  

test.cpp:5:21:警告:非空参数'x'与NULL比较[-Wnonnull-compare]

对于b2变量:

  

test.cpp:6:19:警告:编译器可以假设'x'的地址永远不会为NULL [-Waddress]

     

test.cpp:6:19:警告:非空参数'x'与NULL比较[-Wnonnull-compare]

没有警告b3。

我理解为什么编译器会返回一个警告,'x'永远不会为NULL。但是我不明白为什么这个警告只返回b2而不是b1。

另外,我真的不明白它是什么意思,'& x'是一个非空的论点。这是否意味着,指向引用的指针不是T *类型,但它有一个特殊类型,可以转换为T *?

如果确实重要,我使用编译器g ++(GCC)6.2.1

感谢您的所有提示。

1 个答案:

答案 0 :(得分:0)

b2的额外消息的原因:因为'=='的左侧是x - 的地址直接 - 编译器可以告诉其中一个条款比较是一个立即评估的指针,因此可以发出警告。相比之下,对括号使用b1在括号中添加了一个间接级别 - 在括号外“,编译器只知道那是一个计算结果指针的表达式。由于很少单个项目在生产代码中以这种方式括起来,编译器编写者不会认为值得努力检查括号内的内容是否只是单个术语以发出相同的消息(假设编译器编写者甚至注意到了这个问题。)