boost::optional 已弃用 get_value_or
boost::optional deprecated get_value_or
我怀疑 boost::optional 的 get_value_or
已被弃用,因为如果将右值作为 default
参数传递是不安全的。但是,有时能够引用可选值或默认替代值很有用。
以下安全吗?
template<typename T>
T const& get_reference_or(boost::optional<T> const& opt, T const& alt)
{
if (opt) return opt.get();
else return alt;
}
template<typename T>
T const& get_reference_or(boost::optional<T> const&, T&&) = delete;
正如所写,您的代码在类型推导方面存在问题,因为 T
可以从两个参数推导出来。但是假设你实际上让 T
只能从可选的中推导出来:
template <class T>
struct NonDeducedHelper { using type = T; };
template <class T>
using NonDeduced = typename NonDeducedHelper<T>::type;
template<typename T>
T const& get_reference_or(boost::optional<T> const& opt, NonDeduced<T> const& alt)
{
if (opt) return opt.get();
else return alt;
}
template<typename T>
T const& get_reference_or(boost::optional<T> const&, NonDeduced<T>&&) = delete;
然后,代码几乎是安全的,因为当非const
右值用作get_reference_or
的默认值时,它将尝试使用已删除的重载并且编译失败。但是,为了 100% 安全,您还应该删除 const
右值的重载:
template<typename T>
T const& get_reference_or(boost::optional<T> const&, NonDeduced<T> const&&) = delete;
我怀疑 boost::optional 的 get_value_or
已被弃用,因为如果将右值作为 default
参数传递是不安全的。但是,有时能够引用可选值或默认替代值很有用。
以下安全吗?
template<typename T>
T const& get_reference_or(boost::optional<T> const& opt, T const& alt)
{
if (opt) return opt.get();
else return alt;
}
template<typename T>
T const& get_reference_or(boost::optional<T> const&, T&&) = delete;
正如所写,您的代码在类型推导方面存在问题,因为 T
可以从两个参数推导出来。但是假设你实际上让 T
只能从可选的中推导出来:
template <class T>
struct NonDeducedHelper { using type = T; };
template <class T>
using NonDeduced = typename NonDeducedHelper<T>::type;
template<typename T>
T const& get_reference_or(boost::optional<T> const& opt, NonDeduced<T> const& alt)
{
if (opt) return opt.get();
else return alt;
}
template<typename T>
T const& get_reference_or(boost::optional<T> const&, NonDeduced<T>&&) = delete;
然后,代码几乎是安全的,因为当非const
右值用作get_reference_or
的默认值时,它将尝试使用已删除的重载并且编译失败。但是,为了 100% 安全,您还应该删除 const
右值的重载:
template<typename T>
T const& get_reference_or(boost::optional<T> const&, NonDeduced<T> const&&) = delete;