我正在编写一个实用程序类来“ unwrap ”a std::reference_wrapper
,但我对这意味着什么有点矛盾。
boost::unwrap_reference<T>::type
定义为U
(其中T
为std::reference_wrapper<U>
),但这似乎违反直觉。如果reference_wrapper
意味着“ wrap ”引用,那么我希望“ unwrapped ”reference_wrapper
成为参考
不可否认,这个问题可能导致意见或推测,但是有没有理由更喜欢U
而不是U&
作为展开type
(除了遵循提升模型)?是否有任何技术报告详细说明boost::unwrap_reference
可能为boost模型提供理由?
答案 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
并且不会感到惊讶。