boost::optional
可以存储引用,所以假设我想写一个这样的函数
T frob(const boost::optional<const T&> x) {
return x.value_or(T{42});
}
这会失败,static_assert
因为传递给value_or
引用的参数optional
s 不应该是右值引用。我看到 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;
}
可以说这是一个很好的“我知道我在做什么”的用例,或者我在这里错过了更大的东西吗?