异常是C ++的重要组成部分,使用它的原因之一(我知道有许多更重要的原因)是避免使用大量if
语句混淆代码的不必要检查(也许这是一个不正确的假设?)。
所以现在我很好奇为什么std::shared_ptr::operator*
和std::shared_ptr::operator->
不会抛出null_ptr_exception
或类似内容?
答案 0 :(得分:8)
我的理解是智能指针类的外观和行为与原始指针相似。鉴于这个指导性设计原则,理想情况下遗留代码可以简单地使用等效的所有权语义替换原始指针与智能指针的使用,并且代码将完全像以前一样工作。
因此,更改解除引用智能指针的行为不应该进行任何额外的检查或抛出异常(即,因为原始指针不会以这种方式运行)。
向标准添加智能指针的提议表明了此设计决策(A Proposal to Add General Purpose Smart Pointers to the Library Technical Report):
III。设计决策
一个。一般原则
- "尽可能接近原始指针,但没有更接近"
醇>
答案 1 :(得分:5)
如果需要每次取消引用共享指针来检查nullptr
并有条件地抛出异常,那么可能会有很多冗余检查,代码膨胀和开销。当然 - 优化者可能会消除其中的一部分,但仍然......相反,程序员预计会检查一次,然而许多解除引用。