【问题标题】:Deducing template parameter from default parameter [duplicate]从默认参数推导出模板参数
【发布时间】:2014-06-09 12:39:46
【问题描述】:

为什么这个 C++11 程序不工作:

template <typename T>
void f(T t = 42) {}

int main() { f(); }

为什么不能从默认参数42推导出T

【问题讨论】:

  • 如果你定义了一个默认参数并且显然知道类型,那为什么还要使用模板呢?
  • 这种情况也需要你默认T。这可能不是问题的重点,但确实解决了问题。
  • @Mario,这样您就不会局限于默认参数的类型。
  • 一旦专业化,当然,但不要认为没有它就可以做到,或者定义一个默认类型名就足够了?对于任何其他类型,默认参数会被跳过吗?从来没有真正尝试过做这样的事情。
  • @Mario,是的,只要给模板参数一个默认参数int,你传递给f 的任何东西都会使用它的值和它的类型。如果什么都不通过,T 将是 intt 将是 42。

标签: c++ c++11


【解决方案1】:

14.8.2.5 [temp.deduct.type]

19 - 模板 type-parameter 不能从函数默认参数的类型推导出来。 [...]

给出的例子与你的基本相同。

【讨论】:

  • 知道为什么会有这条规则吗?
  • 可能有歧义? template&lt;typename T&gt; something(T a, T b = 5, T c = 5.2f); 怎么样?
  • 可能是由于所有可能发生的转换。想象一下返回类型也是T。然后你可以有类似float x = f(); 的东西。这对我来说很模棱两可。应该是float x = f&lt;float&gt;() 还是float x = f&lt;int&gt;()?由于静默隐式转换,后者可能会引入静默错误,第一个是无法猜测的。
  • @Mario: 和template&lt;typename T&gt; something(T a, T b, T c); int main() { something(42, 5, 5.2f); }没有什么不同
  • @luk32:为什么用户希望得到float?函数的返回类型不是也不能在 C++ 中从其周围的上下文中推导出来。它与int f(); int main() { float x = f(); } 没有什么不同。我严重怀疑这与该规则的基本原理有关。
猜你喜欢
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 2021-05-23
  • 2020-02-27
  • 1970-01-01
  • 2018-07-04
相关资源
最近更新 更多