【问题标题】:Deducing LValue Reference type推导 LValue 引用类型
【发布时间】:2018-11-22 16:14:10
【问题描述】:

有很多关于模板参数推导的讨论和澄清,特别是引用折叠和“通用引用”。这个问题涉及到相关的细节: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 &amp;?根据 Scott Meyers 的幻灯片(幻灯片 7),ir 是左值引用这一事实被简单地忽略。这完美地解释了这种行为,但为了完美地解释,我花了一些时间阅读参考和标准,试图找到它所说的类似:

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

这是参考的旧离线版本(我通常使用)所说的,尽管它在标题 Conversion Function Template 下说,我在标准。我发现的关闭我认为来自重载模板的部分排序规则,但我不相信它会适用于这里,即使它是我正在寻找的。


标准中是否有指定此行为的地方,或者它是否被我忽略的其他行为所暗示?我真的很想能够告诉某人“因为这里的标准中的这些词,所以不能推断出int &amp; 类型。”

【问题讨论】:

  • 在我的手机上,所以我无法查找,但我相信您正在搜索的措辞是它忽略了顶级 cv-ref 限定符。对我来说,这是执行此操作的自然方式,因为函数看起来像是按值传递,如果对于某些类型它通过引用传递,那将是非常令人惊讶的。

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


【解决方案1】:

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

[expr.type]/1

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

【讨论】:

  • 当我读到它时,我觉得有点傻,我错过了它,但该死的,它解决了我的很多问题。我可以吻你,但请接受真诚的感谢。
猜你喜欢
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多