【问题标题】:Why using to template type with some type traits causes template deduction failure为什么使用具有某些类型特征的模板类型会导致模板推导失败
【发布时间】:2018-03-30 14:36:58
【问题描述】:

我有一个简单的案例:

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

在 this using 中创建一些依赖项使其无法演绎的原因是什么?

【问题讨论】:

    标签: c++ templates type-deduction


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多