模板与常规功能模糊 - UB?

Cri*_*iss -1 c++

template<typename T> T f(T i) { return i+1; }
int f(int i) { return i-1; }

f(2);
Run Code Online (Sandbox Code Playgroud)

这是未定义的行为(请注意,这int f(int)不是专业化)?如果是,那么请指出标准载有这种情况的地方.

R S*_*ahu 6

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


Jar*_*d42 5

它不是UB,甚至不含糊,它只是重载决议:

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

int f(int) 被选中.