为什么';tc++;标准区分右值引用和转发引用? 据我所知,C++标准没有区分R值引用和转发引用。

为什么';tc++;标准区分右值引用和转发引用? 据我所知,C++标准没有区分R值引用和转发引用。,c++,templates,forwarding-reference,value-categories,C++,Templates,Forwarding Reference,Value Categories,我想知道这背后的原因 如果要编写只接受左值表达式的模板函数,请执行以下操作: template<typename T> void func(T& param); 模板 无效函数(T¶m); 但如果我想编写一个只接受右值表达式的模板函数: template<typename T> void func(T&& param); 模板 无效函数(T&¶m); 事实证明,这个函数也接受左值表达式 所以问题是:这种语言设计背后的逻辑是

我想知道这背后的原因

如果要编写只接受左值表达式的模板函数,请执行以下操作:

template<typename T>
void func(T& param); 
模板
无效函数(T¶m);
但如果我想编写一个只接受右值表达式的模板函数:

template<typename T>
void func(T&& param);
模板
无效函数(T&¶m);
事实证明,这个函数也接受左值表达式


所以问题是:这种语言设计背后的逻辑是什么?

它也被称为通用参考

顾名思义,它是一个通用的引用,允许许多不同的类型


如果您希望它保持r值引用(T&&),可以使用,
std:forward(param)
,否则,当您将它传递到任何使用它的地方时,请确保它是您希望的类型。

它也被称为通用引用

顾名思义,它是一个通用的引用,允许许多不同的类型


如果您希望它保持r值引用(T&&),可以使用,
std:forward(param)
,否则,当您将它传递到任何使用它的地方时,请确保它是您希望的类型。

请注意,它过去被称为通用引用。现在正确的术语是“向前”。通用参考是一个过时的术语。请注意,它过去被称为通用参考。现在正确的术语是“向前”。通用参考是一个过时的术语。可能是的副本。可能是的副本。