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 ++模板专业化优先级。模板化专业化的主要内容,如果未能解决你的问题,请参考以下文章

如何在C#中构建我的模板化继承类?

查找是不是可以使用一组参数实例化类模板,arity-wise(在 C++17 中)

2020春招字节跳动二面

函数申明对函数模板实例化的屏蔽

C++模板

C++模板