C ++模板专业化优先级。模板化专业化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++模板专业化优先级。模板化专业化相关的知识,希望对你有一定的参考价值。
主题看起来有点混乱,但是我不知道如何更恰当地表达它,对不起=)
让我们看下面的代码
#include <iostream>
template<typename T>
void f(T value)
std::cout << "f<T>" << std::endl;
template<>
void f(int value)
std::cout << "f<int>" << std::endl;
template<typename T>
struct S
using type = T;
;
template<typename T>
void f(typename S<T>::type value)
std::cout << "f<S<T>>" << std::endl;
;
int main()
f(123);
f<int>(123);
输出为
$ ./testgcc
f<int>
f<S<T>>
所以问题是,为什么第一个调用导致f<int>
专业化,而第二个调用带有显式int模板参数,导致对“ templated” f<S<int>>()
的调用?标准中是否有规则规定在这种情况下如何实例化模板?
提前感谢!
PS经过gcc和clang不同版本的测试-行为相同。我没有要使用MSVC进行测试的Windows系统,但是我在Godbolt上进行了测试,MSVC结果为以下代码:
_main PROC
; ....
push 123 ; 0000007bH
call void f<int>(int) ; f<int>
add esp, 4
push 123 ; 0000007bH
call void f<int>(int) ; f<int>
; ...
因此,MSVC在两种情况下都调用f<int>
。此行为是否记录为实现定义?
答案
您在这里有UB。
另一答案
让我们从简单的案例开始:f(123);
以上是关于C ++模板专业化优先级。模板化专业化的主要内容,如果未能解决你的问题,请参考以下文章