forward <T>(a)和(T &&)之间有什么区别(a)

chi*_*yer 9 c++ c++11

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

template<typename T>  
void outer(T&& t) {inner((T&&)(t));}  
Run Code Online (Sandbox Code Playgroud)

有什么不同?

Xeo*_*Xeo 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;
Run Code Online (Sandbox Code Playgroud)

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&&))更有可能知道它的作用.


Jiv*_*son 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));
    }
Run Code Online (Sandbox Code Playgroud)

  • _标准_定义了它!VC++就是这样实现的。 (3认同)
  • @Lightness:这也是一个函数模板*定义*。:P (3认同)