推导LValue引用类型

时间:2018-11-22 16:14:10

标签: c++ reference standards lvalue template-deduction

关于模板参数推论,尤其是引用折叠和“通用引用”,有很多讨论和澄清。这个问题遍历了相关细节:How does auto deduce type?,斯科特·迈耶斯(Scott Meyers)的这篇论文进行了更详细的介绍,也许提供了更多示例和更广泛的上下文:https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers和他的cppcon幻灯片:http://www.aristeia.com/TalkNotes/C++TypeDeductionandWhyYouCareCppCon2014.pdf
我的问题涉及以下代码:

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
}

为什么我的模板函数f不能推断出他们键入了int &?根据Scott Meyers的幻灯片(幻灯片7),ir是左值引用这一事实被忽略。可以完美地解释这种行为,但是要完美地解释 ,我花了一些时间阅读参考文献和标准,试图找出它的含义,例如:

  

如果 A 是引用类型,则通过推导使用引用的类型。

这是参考的旧的离线版本所说的(我通常使用),尽管它在标题 Conversion Function Template (转换功能模板)下显示,但在标准。我发现关闭的原因是重载模板的部分排序规则,但我不认为它适用于此,即使这正是我想要的。


标准中是否有指定此行为的地方,或者被我忽略的其他行为所暗示?我真的很想告诉别人“由于这里的标准中的这些词,所以不推论int &类型。”

1 个答案:

答案 0 :(得分:1)

C ++中没有引用类型的表达式。 变量 ir的类型为int&,但表达式 ir的类型为int。后一种类型用于类型推导,因为函数参数始终是表达式(在特殊情况下,除了 braised-init-lists )。

请参见[expr.type]/1

  

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