2012-04-26 97 views
4

在move.h,還有是的forwardC++ 11:爲什麼std :: forward中的static_assert必要?

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

兩個重載我看到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授權:

如果所述第二形式是與左值引用類型實例化,是形成不良的節目。

相關問題