使用引用而不是使用指针的优点是否可以证明偶尔出现"空引用"?

Sta*_*ked 2 c++ pointers reference null-pointer

我目前正在设计一个看起来大致如下的类层次结构:

struct Protocol
{
    // Pass lower-layer protocol as a reference.
    Protocol(Protocol & inLLProtocol) :
        mLLProtocol(inLLProtocol)
    {
    }

    // A protocol "always" has a LLProtocol.
    Protocol & mLLProtocol; 
};


struct Layer1Protocol : Protocol
{
    // This is the "bottom" protocol, so I pass a fake reference.
    Layer1Protocol() : Protocol(*static_cast<Protocol*>(nullptr)) {}
};
Run Code Online (Sandbox Code Playgroud)

*nullptr只要永远不会访问引用,IIRC绑定引用就是安全的.所以我现在有责任以这种方式设计我的Layer1Protocol类来防止这种情况发生.

我喜欢这种方法,因为我确保所有用户协议实例都会引用它们各自的低层协议(Layer1Protocol是例外,但它是核心库的一部分).我认为这比使用指针更可取,因为一旦引入指针,就可以传递空指针,然后可能需要在运行时检查,结果是很多指针检查代码和偶尔的错误.

你认为我的基于参考的方法是可以辩护的吗?或者使用空引用总是一种不好的做法?

Cat*_*lus 11

只要永远不会访问引用,IIRC绑定对*nullptr的引用是安全的.

不,解除引用nullptr始终是未定义的行为.您不能在正确的程序中使用"空引用".


sbi*_*sbi 10

写入*static_cast<Protocol*>(nullptr)是取消引用nullptr,调用未定义的行为.你绝不能这样做.结果可能是墨菲所感受到的.这可能就是你所谓的"空引用",但也可能是你(男性,AFAIK)怀孕了,而程序就好像你已经取消引用了一个有效的指针一样.

因此,严格来说,没有"空引用".只有未定义的行为.

你的协议类总是并且不可避免地需要一个较低级别的协议,在这种情况下你不能传递它nullptr(甚至不在参考中伪装).或者它不需要一直使用较低级别的协议,并且必须先检查它是否有一个才能访问它,在这种情况下,指针可以更好地实现您的设计约束.