boost::any 有一个完美的前向构造函数,声明为:
template<typename ValueType>
any(ValueType&& value
, typename boost::disable_if<boost::is_same<any&, ValueType> >::type* = 0 // disable if value has type `any&`
, typename boost::disable_if<boost::is_const<ValueType> >::type* = 0) // disable if value has type `const ValueType&&`
: content(new holder< typename decay<ValueType>::type >(static_cast<ValueType&&>(value)))
{}
is_const<> SFINAE 排除将 const 类型强制为常规复制构造函数:
template<typename ValueType>
any(const ValueType & value)
: content(new holder<
BOOST_DEDUCED_TYPENAME remove_cv<BOOST_DEDUCED_TYPENAME decay<const ValueType>::type>::type
>(value))
{}
如果删除了 is_const<> 排除项,常规复制构造函数处理 const 值的方式与完美前向构造函数的处理方式有何不同?