C++ 具有默认值的模板专门化
这是我正在使用的代码:C++ 具有默认值的模板专门化,c++,c++11,c++14,c++17,template-meta-programming,C++,C++11,C++14,C++17,Template Meta Programming,这是我正在使用的代码: #include <iostream> #include <type_traits> using namespace std; using match_type = void; using match_type_bad = int; // version A template <typename T, typename Attempt = match_type> struct simple_check : false_type {
#include <iostream>
#include <type_traits>
using namespace std;
using match_type = void;
using match_type_bad = int;
// version A
template <typename T, typename Attempt = match_type>
struct simple_check : false_type {};
// version B
template <typename T>
struct simple_check<T, T> : true_type {};
int main() {
cout << simple_check<match_type>::value << endl;
cout << simple_check<match_type_bad>::value << endl;
}
我对C++的tmp的理解有点混乱,因为我假设输出应该是11
我的理由是:
simple\u-check
进入版本B,然后扩展到simple\u-check
,它继承自true\u-type
。因此1
与预期一致简单检查吗
simple\u check
的任何类型X
都应始终为版本Bmatch_type
在决定版本B时强制执行了一些规则
为什么版本A会影响版本B?可能还有别的吗?当你建立一个模板时,它总是在查看专门化之前使用基础版本。它在这里工作,因为第二个模板参数的默认值为
match\u type
所以
simple\u check=>simple\u check
^^这将使用默认值
简单检查=>简单检查
^^还是默认值
完成后,编译器将查看专门化。专门化仅在模板参数相同时有效,因此对于第一次检查,将选择专门化而不是基本模板,对于第二种情况,将使用基本模板,因为专门化无效。看起来编译器首先确定模板参数,然后才检查是否存在专门化(因此第一个默认参数用于两者),并且仅第一个专门化匹配。。。
1
0
simple_check<match_type> => simple_check<match_type, match_type>
^^ this uses the default value
simple_check<match_type_bad> => simple_check<match_type_bad, match_type>
^^ again, default value