我有一个简单的案例:
#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/