【发布时间】:2023-03-20 08:25:01
【问题描述】:
这是我正在使用的代码:
#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;
}
具有此模板特化的程序最终具有以下输出:
1
0
我对 C++ 的 tmp 的理解存在混淆,因为我假设输出应该是 1 1。
我的理由是:
使用
simple_check<match_type>,它进入版本B,然后扩展为继承自true_type的simple_check<match_type, match_type>。所以1符合预期。不应该同样适用于
simple_check<match_type_bad>吗?使用此逻辑,
simple_check<X>中的任何类型X都应始终为版本 B。
似乎版本 A 的默认值 match_type 在决定版本 B 时正在执行某些规则。
为什么版本 A 会影响版本 B?可能还有别的?
【问题讨论】:
-
看起来编译器 first 确定模板参数,并且只有 then 检查是否有专门化(因此第一个默认参数用于两者)并且仅首先专业化匹配...
标签: c++ c++11 c++14 c++17 template-meta-programming