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))
{}
通常のコピー コンストラクターが const 値を処理する方法と、 is_const<> 除外が削除された場合に完全転送コンストラクターが行う方法との違いは何ですか?