我有一个简单的案例:

#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::的左侧,即non-deduced context

另请注意,别名将被视为其别名模板。 An alias itself won't participate in deduction

关于c++ - 为什么使用具有某些类型特征的模板类型会导致模板推导失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49576388/

10-16 04:51