C++ 左值引用类型的推导

C++ 左值引用类型的推导,c++,reference,standards,lvalue,template-argument-deduction,C++,Reference,Standards,Lvalue,Template Argument Deduction,关于模板参数推导,特别是引用折叠和“通用引用”,有很多讨论和澄清。这个问题涉及相关细节:,Scott Meyers的这篇文章更详细,可能给出了更多示例和更广泛的上下文:,以及他的cppcon幻灯片: 我的问题涉及以下代码: template <typename T> void f(T t) { t = 0; } int main() { int i{5}; int &ir{i}; f(ir); cout << i << endl; /

关于模板参数推导,特别是引用折叠和“通用引用”,有很多讨论和澄清。这个问题涉及相关细节:,Scott Meyers的这篇文章更详细,可能给出了更多示例和更广泛的上下文:,以及他的cppcon幻灯片:
我的问题涉及以下代码:

template <typename T> void f(T t) { t = 0; }

int main() {
  int i{5};
  int &ir{i};
  f(ir);
  cout << i << endl; // 5
  f<decltype(ir)>(ir);
  cout << i << endl; // 0
}
template void f(T T){T=0;}
int main(){
int i{5};
int&ir{i};
f(ir);

在C++中没有引用类型的表达式。变量<代码> IR >是代码> int和<代码>,但是表达式的类型<代码> IR >是代码> int <代码>。后一类型用于类型推导,因为函数参数总是表达式(除了在支持的init列表的特殊情况下除外)。 看

如果表达式最初具有类型“reference to
T
”([dcl.ref],[dcl.init.ref]),则在进行任何进一步分析之前,该类型将调整为
T
。 表达式指定由引用表示的对象或函数,表达式是左值或x值,具体取决于表达式


在我的手机上,所以我无法查找它,但我相信您正在搜索的措辞是它忽略了顶级cv ref限定符。对我来说,这是一种自然的方式,因为函数看起来像是通过值传递的,如果某些类型的函数是通过引用传递的,这将非常令人惊讶。我觉得有点傻,当我阅读它时,我忽略了这一点,b这解决了我的很多问题。我可以吻你,但请接受真诚的感谢。