首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >推导LValue参考类型

推导LValue参考类型
EN

Stack Overflow用户
提问于 2018-11-22 16:14:10
回答 1查看 90关注 0票数 2

关于模板参数推导,特别是引用崩溃和“通用引用”,有很多讨论和澄清。这个问题贯穿于相关细节:自动推断类型如何?,由Scott撰写的这篇论文更加详细,也许会给出更多的例子和更广泛的背景:https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers和他的cppcon幻灯片:http://www.aristeia.com/TalkNotes/C++TypeDeductionandWhyYouCareCppCon2014.pdf

我的问题涉及以下代码:

代码语言:javascript
复制
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 &类型。”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,具体取决于表达式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53434825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档