c++ std::forward描述,哪一项正确?

xu3bshqb  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(124)

我正在寻找std::forward,发现了两个链接,它们的描述可以有不同的解释。
cplusplus.com:如果arg不是左值*引用***,则返回arg的右值引用
cppreference.com:将左值转发为左值或右值,具体取决于T
我想区别在于
引用**。
你能告诉我哪个解释是正确的吗?谢谢。
找到描述并比较

ffx8fchx

ffx8fchx1#

cppreference是正确的,而cplusplus是错误的
来自标准§forward

template<class T> constexpr T&& forward(remove_reference_t<T>& t) noexcept;
template<class T> constexpr T&& forward(remove_reference_t<T>&& t) noexcept;
  • 命令:对于第二次过载,is_­lvalue_­reference_­v<T>false
  • 返回值:static_­cast<T&&>(t)

注解

  • 该函数总是接受引用并返回引用。
  • 模板参数T始终显式指定,它从不从函数参数t(或arg)推导

来自cplusplus
如果arg不是左值引用,则返回对arg的右值引用。
如果arg是左值引用,则函数返回arg而不修改其类型。
这是不正确的

  • 如果T是左值引用类型,则右值(第一个)重载应该导致错误
  • 如果T是右值(引用类型),则左值(第二个)重载应返回右值

cppreference开始

template< class T >
constexpr T&& forward( std::remove_reference_t<T>& t ) noexcept;

将左值转发为左值或右值,具体取决于T

template< class T >
constexpr T&& forward( std::remove_reference_t<T>& t ) noexcept;

将右值作为右值转发,并禁止将右值作为左值转发
这是正确的。

相关问题