1

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 值的方式与完美前向构造函数的处理方式有何不同?

4

1 回答 1

0

第一个专门用于右值引用(enable_if确保它)。

static_cast 是 using 的同义词std::move,因此它会移动。

于 2016-02-17T08:23:47.663 回答