如何修复"引用无法绑定到解除引用的空指针"警告

JOM*_*JOM 2 c++ reference xcode6

Xcode 6.3(测试版)给了我新的警告,任何建议如何解决问题?我不认为完全删除检查是一个正确的答案,因为在某些情况下"相机"已经为NULL并导致其他地方以后崩溃.

在明确定义的C++代码中,引用不能绑定到取消引用的空指针; 可以假设比较总是评估为假

这是代码.我怎么能验证相机存在?

Camera& camera = sceneEngine->camera();
// FIXME: this triggers an undefined-bool-conversion warning in Xcode 6.3 BETA
if (&camera == NULL) return;
Run Code Online (Sandbox Code Playgroud)

以及SceneEngine的相关方法:

// HEADER
class SceneEngine
{
public:
    Camera& camera();
protected:
    Camera camera_;
}

// CPP
Camera& SceneEngine::camera() {
    return camera_;
}
Run Code Online (Sandbox Code Playgroud)

eml*_*lai 6

由于camera对象是通过引用返回的,因此它不能为null,因为引用始终指向实际的现有对象.

因此,如果你获取引用变量的地址,它不能为null,因为它无论如何都指向一个有效的对象.

只需使用返回值而不进行任何空检查.

PS.如果函数返回对不存在的对象的引用(例如null),那就是未定义的行为.

解:

如果camera()需要能够在某个时刻返回null,则将其返回类型更改Camera*为能够返回空指针.

否则 - camera()永远不会返回null,即它总是返回对有效对象的引用 - 不需要进行空检查,这就是错误消息所说的内容.


cma*_*ter 5

由于语言标准定义了您在拥有NULL引用时具有未定义的行为,因此允许编译器完全优化您的条件。因此,这段代码没用。警告会通知您这一点。

要消除警告,您需要以一种确保首先不会生成NULL引用的方式编写代码。即,在你编写这样的代码之前:

void bar(Camera& cam);
void foo(Camera* cam) {
    bar(*cam);
}
Run Code Online (Sandbox Code Playgroud)

在将其转换为引用之前,您需要检查指针:

void bar(Camera& cam);
void foo(Camera* cam) {
    if(cam) bar(*cam);    //this works as desired
}
Run Code Online (Sandbox Code Playgroud)