c++ - 为什么使用具有某些类型特征的模板类型会导致模板推导失败

标签 c++ templates type-deduction

我有这个简单的案例:

#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>;

在这个 using 中创建一些依赖性使其不可推导的原因是什么?

最佳答案

这是因为 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/

相关文章:

继承类上的 C++ OpenCV mouseCallback

c++ - 从一种类型转换为另一种类型时的模板类型推导

c++ - 自动初始化后变量的大小

安卓工作室,CMake。如何在编译时打印调试信息?

c++ - 在构建时从源代码编译 OpenCV 3

c++ - 互斥保护 : is there any automated protection mechanism for objects?

c++ - 用于函数调用的带有可变参数模板的模板类型推导

c++ - 模板和标题

ajax - JSF 2 更新表单之外和 Facelet 之外的组件

c++ - 为什么这两个模板函数的输出不同?