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