“解包”reference_wrapper意味着什么?

时间:2018-01-03 02:15:09

标签: c++ boost reference-wrapper

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

boost::unwrap_reference<T>::type定义为U(其中Tstd::reference_wrapper<U>),但这似乎违反直觉。如果reference_wrapper意味着“ wrap ”引用,那么我希望“ unwrapped reference_wrapper 成为参考

不可否认,这个问题可能导致意见或推测,但是有没有理由更喜欢U而不是U&作为展开type(除了遵循提升模型)?是否有任何技术报告详细说明boost::unwrap_reference可能为boost模型提供理由?

1 个答案:

答案 0 :(得分:1)

我不知道它有什么不同。

我认为添加& - 限定符比使用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_reference中实际使用boost/core/ref.hpp特征的少数几个地方之一

因为我们知道class_type未经过重新认证,所以更容易将其提交到is_callable并且不会感到惊讶。