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++ 风格的强制转换来确定第一个有效的强制转换。其中一个是static_cast,这也是在这种情况下工作的第一个。

§5.4 [expr.cast] p4

执行的转换

  • 一个const_cast(5.2.11),
  • 一个static_cast(5.2.9),
  • astatic_cast后跟 a const_cast,
  • a reinterpret_cast(5.2.10),或
  • areinterpret_cast后跟 a 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 回答