为什么我们可以在包含boost :: none的boost :: optional <T>上使用Indirection/Dereferencing(*)运算符?

Blu*_*rin 7 c++ boost

以下行不会在运行时抛出异常:

    boost::optional<double> dummy(boost::none);
    double testValue = *dummy;
Run Code Online (Sandbox Code Playgroud)

升级开发人员*boost::optional包含时使用间接运算符()时是否有理由决定不抛出boost::none?作为参考,我testValue在上面的代码中得到随机值,因为它可能分配了内存的随机单元化部分.

这可能会导致无提示错误,因为您负责在使用之前检查该值.

Ger*_*ago 9

我能想到2:

  • 一致性 - 基本类型不检查这一点.
  • 速度.解除引用是一个小而快速的操作,因此添加一个检查可能会产生大量的开销,按比例.

它与数组边界检查的情况相同:很好,但价格昂贵.

  • 取消引用一个可选项不仅小而快,它是免费的** - 它就像直接读取`double`一样.抛出需要检查,并且检查是分支,并且为每个原始类型的读取添加分支可以容易地使其快一半. (2认同)