1

boost::optional可以存储引用,所以假设我想写一个这样的函数

T frob(const boost::optional<const T&> x) {
    return x.value_or(T{42});
}

这会失败,static_assert因为传递给value_or引用的参数optionals 不应该是右值引用。我看到 boost 库的作者决定保护我免受类似

auto& l = x.value_or(T{42});

在那里我可以得到一个临时的悬空引用。

但是如果“我知道我在做什么”我可以用类似的东西来规避这个

T frob(const boost::optional<const T&> x) {
    return x.value_or(to_lvalue(T{42}));
}

哪里to_lvalue可以定义为

template<class T>
T& to_lvalue(T&& r) {
    return r;
}

可以说这是一个很好的“我知道我在做什么”的用例,或者我在这里错过了更大的东西吗?

4

0 回答 0