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))
{}

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

4

1 に答える 1

0

最初のものは特に右辺値参照用です (これenable_ifを保証します)。

static_cast は using と同義であるためstd::move、移動します。

于 2016-02-17T08:23:47.663 に答える