NULL直接传递给期望const引用参数的函数(VC++ 4.2)

Den*_*nis 4 c++ reference null-pointer visual-c++

我正在寻找一些我在旧代码库中发现的东西,我很困惑.

这是一个函数定义:

void vUpdateSequenceDetailsAndIncrement(
            const CallEvent& roCPEvent,
            const CallInfo& roCallInfo,
            BOOL bCreationEvent);
Run Code Online (Sandbox Code Playgroud)

这里被称为:

vUpdateSequenceDetailsAndIncrement(roCPEvent, NULL, FALSE);
Run Code Online (Sandbox Code Playgroud)

这里NULL直接传递给引用参数roCallInfo.这个函数最终调用:

vTimeChange(*pSeqDetails, roCPEvent, roCallInfo);
Run Code Online (Sandbox Code Playgroud)

定义如下:

void vTimeChange(const SequenceDetails& roSequenceDetails,
        const CallEvent& roCPEvent,
        const CallInfo& roCallInfo)
Run Code Online (Sandbox Code Playgroud)

再次将可能的NULL值传递给roCallInfo.我以为NULL不能作为引用传递?有谁知道VC++ 4.x是否有某种问题导致这种代码没问题?如果NULL可以作为引用传递,那么在vTimeChange中会发生这样的事情:

roCallInfo.getCallStartTime(); 
Run Code Online (Sandbox Code Playgroud)

这不是我取消引用NULL的方式,就像我要做的那样

CallInfo * info = NULL;
info->getCallStartTime();
Run Code Online (Sandbox Code Playgroud)

?我可能会在那里放一个警卫,让编译器删除它,如果没有必要,但我想深究这是怎么回事!

谢谢.

c-s*_*ile 8

取决于如何在VC 4.2中定义NULL

如果只是

#define NULL 0 
Run Code Online (Sandbox Code Playgroud)

那么你实际上是在引擎盖下:

vUpdateSequenceDetailsAndIncrement(roCPEvent, CallInfo(0), FALSE);
Run Code Online (Sandbox Code Playgroud)

并且将CallInfo类型的temp var的引用传递给函数(如果CallInfo具有兼容的ctor)

  • Dennis,这意味着`CallInfo`有一个构造函数,允许它从`int`隐式创建*.如果它还有`operator ==`的定义,那么你对`NULL`的比较也会起作用,因为`NULL`将再次隐式转换为`CallInfo`.该程序创建一个*临时*`CallInfo`对象,该对象在其所涉及的语句的持续时间内存在,因此您在该临时对象上调用`getCallStartTime`.那是非常安全的.如果您不想进行此隐式转换,请将构造函数标记为"explicit". (2认同)

Alo*_*ave 5

我以为NULL不能作为参考传递?

有效引用不能为null,但无效引用可以为null.
你在这里有一个无效的参考.

引用不能为null的事实并不意味着引用在某种程度上比指针更安全,正如您在本例中所见.程序可能有多种方式导致无效引用,您的代码就是这样一个例子.

参考维基百科:
事实上还有一些方法reference可以开始invalid.因为引用通常作为底层指针实现,所以初始化指针解除引用表达式的引用通常由编译器实现为从指向引用的底层指针的指针的简单赋值.因此,如果您的NULL指针或指针指向内存中的无效位置,您实际上会有一个指向NULL或无效位置的引用.C++纯粹主义者会争辩说,从技术上讲,取消引用NULL或无效指针会导致未定义的行为,所以这并不违反上面的断言,即引用不能为null或指向内存中的任意位置.但是,这忽略了这样一个事实:在这种情况下,底层实现只是执行"赋值",并且没有访问所涉及的内存位置,因此引用的初始化通常不会引起问题,程序员必须知道真实程序中事实上"无效"引用的可能性.

使用无效引用 roSequenceDetails最终会导致未定义的行为.