【问题标题】:Type deduction for template references模板引用的类型推导
【发布时间】:2019-07-08 17:42:02
【问题描述】:

让我们考虑以下代码:

template<typename T>
void f(T&);

int x=0;
int y=1;
f(x+y);

此代码似乎发生了类型推断。但为什么?没有参考折叠规则会在最后产生 int&&。

【问题讨论】:

  • 您是否偶然使用了 MSVS?
  • 我在尝试编译时遇到错误,如预期的那样
  • g++;铛; MSVC 全部报告错误 - 实时:godbolt.org/z/QwHqvk
  • @Richard Critten 但我没有说它可以编译。问题是在拒绝该代码之前是否执行类型推导。

标签: c++ c++11 rvalue-reference type-deduction


【解决方案1】:

根据C++17标准,[temp.deduct.call]/3:

...如果P是引用类型,则P所引用的类型用于类型推导。 ...

这里,PT&amp;,因此编译器会删除引用并将T 与参数x+y 的类型进行比较。因此它将T 推导出为int。然后,在重载解析阶段,由于int类型的右值无法绑定到int&amp;类型的参数,因此发生错误。

模板参数推导必须在重载解析之前进行,否则编译器将不知道使用什么参数类型进行重载解析。

【讨论】:

  • 谢谢。为什么编译器不能优化分析并在这种情况下跳过重载解析(很明显模板函数 f 不能产生带右值的函数)?它只是看起来多余。
  • @beginpluses 好吧,编译器内部到底发生了什么并不明显。实际上,只要这些优化产生的结果与标准要求的结果相同,就程序是否格式正确而言,它可能会进行优化。
  • @beginpluses 此外,可以使用const int 类型的xvalue 参数调用f。在这种情况下,T 将被推导出为const int 并且const int&amp; 可以绑定到右值。
  • 我没说对。我在问为什么标准不要求编译器在这种情况下不执行类型推导。
  • @beginpluses 会有什么不同?结果将是相同的:程序格式错误。为什么要使标准复杂化以达到相同的结果?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多