1

std::make_shared が宣言/実装されている理由を理解しようとしています:

template<class _Tp, class ..._Args>
inline _LIBCPP_INLINE_VISIBILITY
typename enable_if
<
    !is_array<_Tp>::value,
    shared_ptr<_Tp>
>::type
make_shared(_Args&& ...__args)
{
    return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...);
}

私が興味があるのは:

  • make_sharedが右辺値参照のみを受け入れるのはなぜですか? 定数への参照 (つまりconst _Args &) のオーバーロードがないのはなぜですか?
  • _VSTD::forward電話のポイントは何ですか?

適切な説明または適切なハイパーリンクは、どちらも高く評価されます。

4

1 に答える 1

4

make_shared が右辺値参照のみを受け入れるのはなぜですか? 定数への参照 (つまり、const _Args &) のオーバーロードがないのはなぜですか?

これは、r 値と l 値の両方にバインドされるユニバーサル参照です。右辺値の場合、推定される型はT、左辺値の場合はT&です。

_VSTD::forward 呼び出しのポイントは何ですか?

一時が右辺値参照にバインドされると、その参照 (名前) は右辺値ではなくなります。値の元の値カテゴリを復元できる必要があります。これはstd::forward<>、右辺値の引数を右辺値として転送し、左辺値の引数を左辺値として転送するためのものです。

基本的にまたはにstd::forward適用されます。適用される場合&&TT&&&

  • TそれはT&&次のようになります - r値参照、および
  • T&になりますT&&&、これまたT&
于 2015-12-10T13:26:16.287 に答える