0

我正在编写一个实用程序类来“解包” a std::reference_wrapper,但我对这意味着什么有点矛盾。

boost::unwrap_reference<T>::type被定义为U(where Tis std::reference_wrapper<U>),但这似乎违反直觉。如果 areference_wrapper旨在“包装”一个引用,那么我希望一个“未包装reference_wrapper一个引用

诚然,这个问题可能会导致意见或猜想,但有什么理由更喜欢U展开U&type(除了遵循 boost 模型)?是否有任何详细boost::unwrap_reference的技术报告可以为 boost 的模型提供基本原理?

4

1 回答 1

1

我看不出它有什么不同。

我想添加&-qualifier 比删除它更容易std::remove_reference

事实上,这可能是原因:在裸类型上进行进一步的类型组合比始终处理 const/volatile/ref 限定要容易得多。参见例如这种用法:

template<typename Class, typename TypeIn, typename TypeOut>
struct is_cnv<Class, TypeIn, TypeOut, typename enable_if<is_class<Class>, void>::type>
{
    typedef typename ::boost::unwrap_reference<Class>::type class_type;
    typedef void signature_type(TypeIn const&, optional<TypeOut>&);

    BOOST_DECLARE_IS_CALLABLE(is_callable, operator());

    BOOST_STATIC_CONSTANT(bool, value = (is_callable<class_type, signature_type>::value));
};

(即在 中convert/detail/is_converter.hpp,是少数几个真正使用unwrap_referencefrom 特征的地方之一boost/core/ref.hpp

因为我们知道class_type它不是 ref-qualified,所以更容易输入它is_callable并且不会感到惊讶。

于 2018-01-03T02:49:02.323 回答