9
template<typename T>  
void outer(T&& t) {inner(forward<T>(t));}  

template<typename T>  
void outer(T&& t) {inner((T&&)(t));}  

違いはなんですか?

4

2 に答える 2

9

実用的な違いはありません。std::forward<T>(v)として指定されstatic_cast<T&&>(v)ます。

§20.2.3 [forward]

template <class T> T&& forward(typename remove_reference<T>::type& t) noexcept;
template <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept;

2戻り値: static_cast<T&&>(t)

Cスタイルのキャストは、ほとんどのC ++スタイルのキャストを通過して、最初に機能するキャストを決定します。そのうちの1static_castつは、です。これは、この場合に機能する最初のものでもあります。

§5.4 [expr.cast] p4

によって実行される変換

  • a const_cast(5.2.11)、
  • a static_cast(5.2.9)、
  • static_cast続いてconst_cast
  • a reinterpret_cast(5.2.10)、または
  • reinterpret_cast続いてconst_cast

明示的な型変換のキャスト表記を使用して実行できます。[...]変換が上記の複数の方法で解釈できる場合、その解釈から生じるキャストの形式が正しくない場合でも、リストの最初に表示される解釈が使用されます。

しかし、私は固執することをお勧めしstd::forwardます。static_cast<T&&>その意図は名前から明らかであり、人々は奇妙な(またはさえ)何をするかを知るよりも、それが何をする可能性がはるかに高いかを知るでしょう(T&&)

于 2012-12-02T09:53:01.110 に答える
1

効果的な違いはありません。以下は、VC++ が右辺値参照の forward<> を定義する方法です。

template<class _Ty> inline
    _Ty&& forward(typename remove_reference<_Ty>::type&& _Arg) _NOEXCEPT
    { // forward anything
        static_assert(!is_lvalue_reference<_Ty>::value, "bad forward call");
        return (static_cast<_Ty&&>(_Arg));
    }
于 2012-12-02T09:38:35.237 に答える