C++ 为什么std::forward()不';不推断类型?

C++ 为什么std::forward()不';不推断类型?,c++,c++11,reference,rvalue,C++,C++11,Reference,Rvalue,下面是代码。为什么如果我用S&替换typename remove\u reference::type&,它将无法正常工作?(我的意思是一个类型将被推断为错误) 如果我传递一个右值(让int为int),那么S将被推断为int,a的类型是int&,forward()返回int&(右值) 如果我传递一个左值(int)S将被推断为int&,a的类型是int&&->int&,forward()返回int&&&->int&。一切正常,那么为什么我们需要删除\u引用 template<class S&g

下面是代码。为什么如果我用
S&
替换
typename remove\u reference::type&
,它将无法正常工作?(我的意思是一个类型将被推断为错误)

如果我传递一个右值(让int为int),那么
S
将被推断为
int
a
的类型是
int&
forward()
返回
int&
(右值)

如果我传递一个左值(
int
S
将被推断为
int&
a
的类型是
int&&->int&
forward()
返回
int&&&->int&
。一切正常,那么为什么我们需要
删除\u引用

template<class S>
S&& forward(typename remove_reference<S>::type& a) noexcept
{
  return static_cast<S&&>(a);
} 
模板
S&&forward(typename remove_reference::type&a)无例外
{
返回静态_-cast(a);
} 

考虑
转发的原始用例:

template<class T>
void f(T&& t) { g(std::forward<T>(t)); }

处理右值。

我不熟悉复杂的类型推断规则,但为什么您认为在这种情况下可以推断出
S
?无论用什么样的引用或非引用类型来代替
S
,引用都会被剥离,并产生左值引用类型(如果
S
是这样的话,我想可能是
const
)。由于不同的
S
给出了相同的结果,我认为如果简单地禁止尝试这种类型的“推断”是合理的。向前
重载可以处理
右值,但是,不是吗?至少在规范转发上下文中使用时-正是因为
forward
本身只在其参数中看到左值-这里真正重要的是显式模板参数规范,它通过强制转换到正确的类型使转发工作。
template <class T> constexpr T&& forward(remove_reference_t<T>&& t) noexcept;