forward <t>(a)和(T&amp;&amp;)(a)</t>之间的区别是什么

时间:2012-12-02 09:02:53

标签: c++ c++11

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

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

有什么区别?

2 个答案:

答案 0 :(得分: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 ++风格的演员阵容,以确定第一个演员。其中一个是static_cast,这也是第一个适用于这种情况的人。

§5.4 [expr.cast] p4

  

执行的转化      
      
  • a const_cast(5.2.11),
  •   
  • a static_cast(5.2.9),
  •   
  • a static_cast后跟const_cast
  •   
  • a reinterpret_cast(5.2.10)或
  •   
  • a reinterpret_cast后跟const_cast
  •   
     

可以使用显式类型转换的强制转换表示法执行。 [...]如果转换可以用上面列出的多种方式解释,则使用列表中首先出现的解释,即使由该解释产生的转换形式不正确。

但我建议坚持使用std::forward。意图从名称中清晰可见,并且人们将比知道奇怪的static_cast<T&&>(甚至(T&&))做什么更有可能知道它的作用。

答案 1 :(得分:1)

没有有效的区别。以下是C ++如何定义转发&lt;&gt;对于右值参考:

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));
    }
相关问题