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

gcc 的 C++ 部分模板专业化问题

c ++模板专业化和模板参数的数量

gcc 4.5.1 与 VC2010 模板部分专业化:哪个符合 C++0x?

const char array (c style string) 模板特化

功能模板专业化的重要性和必要性

C++ 部分模板专业化 - 设计简化