C++ 模板与常规函数不确定性-UB? 模板tf(ti){返回i+1;} intf(inti){返回i-1;} f(2);

C++ 模板与常规函数不确定性-UB? 模板tf(ti){返回i+1;} intf(inti){返回i-1;} f(2);,c++,C++,这是一种未定义的行为(请注意,intf(int)不是专门化)?如果是,请指出《标准》在何处包含此类情况 这里没有歧义。如果使用int调用f,只要两个声明在使用点都可见,就会始终选择重载的非模板版本。它不是UB,甚至不含糊,只是: 两者完全匹配,但一个是模板函数,而另一个不是: int f(int)被选中。我认为您误解了UB是什么……通过UB,您的意思是含糊不清的吗?不管怎样,都不是。我指的不是标准定义的东西。Ofc如果它是以某种方式定义的,我仍然愿意知道:)@cris正确的术语是“unspeci

这是一种未定义的行为(请注意,
intf(int)
不是专门化)?如果是,请指出《标准》在何处包含此类情况

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

它不是UB,甚至不含糊,只是:

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


int f(int)
被选中。

我认为您误解了UB是什么……通过
UB
,您的意思是含糊不清的吗?不管怎样,都不是。我指的不是标准定义的东西。Ofc如果它是以某种方式定义的,我仍然愿意知道:)@cris正确的术语是“unspecified”。下面是要阅读的部分:“……在重载解析开始之前,通过名称查找和模板参数推断选择的函数被组合成候选函数集(确切的标准取决于重载解析发生的上下文,请参见下文)…”并继续阅读。如果您确实想这样做(对于类型
int
,有一个特定的不同函数
f
),模板专门化(
template intf(inti){return i-1;})之间的区别是什么
)和重载该函数(如问题中所述)?使用它们中的任何一个有什么好处吗?还是(如我所怀疑的)同样的事情?@apalomer:你可以把这个问题当作问题而不是评论来问。在OP的例子中,基本上是一样的,但事情可能更复杂,因为模板函数不可能进行部分专门化。一个常见的例子是处理
T
T*
int*
。不需要问这是一个问题。在挖掘了一些信息之后,我找到了关于这个话题的问题和答案。无论如何,谢谢!
template<typename T> T f(T i) { return i+1; }
int f(int i) { return i-1; }

f(2);