关于模板参数推论,尤其是引用折叠和“通用引用”,有很多讨论和澄清。这个问题遍历了相关细节: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 &
类型。”
答案 0 :(得分:1)
C ++中没有引用类型的表达式。 变量 ir
的类型为int&
,但表达式 ir
的类型为int
。后一种类型用于类型推导,因为函数参数始终是表达式(在特殊情况下,除了 braised-init-lists )。
如果表达式最初的类型为“对
T
的引用([dcl.ref],[dcl.init.ref]),则在进行任何进一步分析之前,将其类型调整为T
。 表达式指定由引用表示的对象或函数,并且表达式取决于表达式是左值还是x值。