为什么使用某些类型特征的模板类型会导致模板扣除失败

Why using to template type with some type traits causes template deduction failure

本文关键字:类型 失败 特征 为什么      更新时间:2023-10-16

我有一个简单的情况:

#include <iostream>
#include <type_traits>
template<typename T>
struct Handle_ {
    T vlue;
};
template<typename T>
using Handle = Handle_<std::enable_if_t<true, T>>;
template<typename T>
void fooo(Handle<T> h, int a) {
}
int main() {
    Handle<int> a;
    fooo(a, 4);
}

不编译的

,因为fooo的模板参数扣除失败。如果从Handle使用std::enable_if_t删除 - 它可以工作。

template<typename T>
using Handle = Handle_<T>;

在使用这种情况下创建某些依赖性的原因是什么?

这是因为 std::enable_if_t

的别名
template< bool B, class T = void >
using enable_if_t = typename enable_if<B,T>::type;

因此, T::的左侧,这是一个未折叠的上下文。

还注意,一个别名将被视为其别名模板。别名本身不会参加扣除。