关于模板参数推导,特别是引用崩溃和“通用引用”,有很多讨论和澄清。这个问题贯穿于相关细节:自动推断类型如何?,由Scott撰写的这篇论文更加详细,也许会给出更多的例子和更广泛的背景: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的幻灯片(幻灯片7),ir是值引用这一事实被忽略了。这很好地解释了这种行为,但为了完美地解释,我花了一些时间阅读参考资料和标准,试图找出其中的内容如下:
如果A是引用类型,则通过演绎使用所引用的类型。
这就是引用的旧的离线版本(我通常使用的),尽管它是在标头转换函数模板下说的,而且我还没有在标准中找到这种措辞。我发现的闭包来自于重载模板的偏序规则,但我不认为它适用于这里,即使它是我正在寻找的。
在标准中是否有指定此行为的地方,或者它是否被我忽略的其他行为所暗示?我真的很想告诉别人,“因为标准中的这些词,所以不能推断出int &类型。”
发布于 2018-11-22 16:49:24
在C++中没有引用类型的表达式。变量ir的类型是int&,但表达式ir的类型是int。后一种类型用于类型推断,因为函数参数总是表达式(除了大括号-init-list的特殊情况外)。
请参阅[expr.type]/1
如果表达式最初的类型为“对
T的引用”(dcl.ref,dcl.init.ref),则在进一步分析之前将该类型调整为T。表达式指定引用所表示的对象或函数,表达式是lvalue或xvalue,具体取决于表达式。
https://stackoverflow.com/questions/53434825
复制相似问题