Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有默认值的模板专门化_C++_C++11_C++14_C++17_Template Meta Programming - Fatal编程技术网

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
    都应始终为版本B

  • 似乎版本A的默认值
    match_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