【问题标题】:template vs regular function ambiguity - UB?模板与常规功能的歧义 - UB?
【发布时间】:2018-08-14 07:06:29
【问题描述】:
template<typename T> T f(T i) { return i+1; }
int f(int i) { return i-1; }

f(2);

这是未定义的行为(注意int f(int) 不是特化)?如果是,那么请指出标准在哪里进行这种情况。

【问题讨论】:

  • 我认为你误解了 UB 是什么......
  • UB,你的意思是 ambiguous 吗?无论哪种方式,都没有。它不是
  • 我所说的 UB 是指标准未定义的东西。 Ofc 如果以某种方式定义,我仍然愿意知道:)
  • @Criss 正确的说法是“未指定”。
  • 这里是要阅读的部分:en.cppreference.com/w/cpp/language/overload_resolution "...在重载决议开始之前,通过名称查找和模板参数推导选择的函数组合起来形成候选函数集(确切的标准取决于发生重载决议的上下文,见下文)。...“并继续阅读。

标签: c++


【解决方案1】:

这里没有歧义。如果使用int 调用f,则只要两个声明在使用点可见,就会始终选择重载的非模板版本。

【讨论】:

    【解决方案2】:

    不是UB也不是暧昧,就是overload resolution

    两者都是完全匹配,但一个是模板函数,另一个不是:

    int f(int) 被选中。

    【讨论】:

    • 如果您确实想要执行此操作(对于 int 类型具有特定的不同函数 f),模板专业化 (template&lt;&gt; int f(int i) { return i-1; }) 和重载该函数有什么区别(正如他的问题所做的那样)?使用其中任何一个有什么优势吗?还是(我怀疑)完全一样?
    • @apalomer:您可能会将此问题作为问题而不是评论提出。在 OP 的示例中,它几乎是相同的,但事情可能会更复杂,因为模板函数无法实现部分专业化。一个常见的例子是处理TT*int*
    • 没有必要将其作为问题提出。在挖掘了一些之后,我发现了thisthis qustions 和关于该主题的答案。还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2010-09-08
    相关资源
    最近更新 更多