2012-04-26 12 views
4

は、forwardC++ 11:std :: forwardのstatic_assertはなぜ必要ですか? move.hで

template<typename _Tp> 
constexpr _Tp&& 
forward(typename std::remove_reference<_Tp>::type& __t) noexcept 
{ 
    return static_cast<_Tp&&>(__t); 
} 

template<typename _Tp> 
constexpr _Tp&& 
forward(typename std::remove_reference<_Tp>::type&& __t) noexcept 
{ 
    static_assert(
     !std::is_lvalue_reference<_Tp>::value, 
     "template argument substituting _Tp is an lvalue reference type" 
    ); 
    return static_cast<_Tp&&>(__t); 
} 

の2つのオーバーロードがそこにいる私はstatic_assertは左辺値に右辺値をキャスト誤っ防ぐためです参照してください。右辺値バージョンは、この方法を実装することができます:

template<typename _Tp> 
typename std::remove_reference<_Tp>::type&&   
forward(typename std::remove_reference<_Tp>::type&& __t) noexcept 
{ 
    return __t; 
} 

答えて

5

N2951のユースケースCを参照して、左辺値として右辺値を転送することは危険である理由として例として。このユースケースは、そのようにすると、いかにして参照を作成するのが容易になるかを示しています。

5

それはstd::forward<std::string&>(std::string {})のような奇妙なことを防ぐことができます。第二の形態は、左辺値参照型でインスタンス化されている場合、プログラムは病気形成され

挙動は§20.2.3p2によって義務付けられています。

関連する問題