在以下用例中使用 boost::optional 有好处吗?

Benefit from using boost::optional in the following usecase?

这是一个非常基础的问题。在以下情况下使用 boost::optional 是否有任何好处:

int somefunction(boost::optional<const Param&> value = getDefaultParam()){
    return value->dosomething();
}

int somefunction(boost::optional<const Param&> value){
    if (!value) 
            value = getDefaultParam();
    return value->dosomething();
}

而不只是这样做:

int somefunction(const Param& value = getDefaultParam()){
    return value.dosomething();
}

这是针对我知道我正在将 Param 对象初始化为默认值的特定情况。在 Param 上使用 boost::optional 对 API 或 API 的客户端有什么好处吗?

首先,这很糟糕:

int somefunction(boost::optional<const Param&> value = getDefaultParam()){
    return value->dosomething();
}

someFunction 可以用 boost::none 调用,在这种情况下尝试访问它的值将引发异常。

其次,如果您有 boost::optional<const Param&>,则会提供 API 以获取其值或默认值:

boost::optional<const Param&> value = ...;
value.value_or(getDefaultParam()).doSomething();

编辑:在这种简单的情况下,可能不值得引入 optional。如果你这样做:

int someFunc(const Param& value = getDefaultParam())
{
    return value.doSomething();
}

// Elsewhere...
int x = someCondition ? someFunc(abc) : someFunc();

这里 optional 真的没有意义。当然,像这样简单的东西,可能也不需要someFunc

int x = (someCondition ? abc : getDefaultParam()).doSomething();

但是,如果您需要长期 storage/tracking 判断某个值是否可用,那么 boost::optional 可能是合适的。