【问题标题】:Why type deduction of function parameters are prioritized over the types from template?为什么函数参数的类型推导优先于模板中的类型?
【发布时间】:2021-08-15 06:19:08
【问题描述】:

让我们看一下enable_if用法的简单例子

template <bool, typename T = void>
struct enable_if
{
};

template <typename T>
struct enable_if<true, T>
{
    typedef T type;
};
  1. 这里预计y 将是int,因为T 是我们的“启用”类型。
template <typename T, typename Y = typename std::enable_if<std::is_integral<T>::value, T>::type>
void do_stuff(T t)
{
    (void)t;
    Y y;
    std::cout << typeid(y).name() << std::endl;
}
do_stuff(15); // int
  1. 但这里的事情对我来说有些不明确,y 将被推断为实际参数的类型
template <typename T, typename Y = typename std::enable_if<std::is_integral<T>::value, T>::type>
void do_stuff(T t, Y y)
{
    (void)t;
    std::cout << "do_stuff integral\n";
    std::cout << typeid(y).name() << std::endl;
}

do_stuff(15, 14.3);  // double

所以我的问题是:

强制编译器优先从传递的实际参数中扣除y 并忽略enable_if 中启用的type 的规则是什么?

【问题讨论】:

  • 就是这样。如果可以,编译器将始终推断出参数。如果只有当它不能时,它使用默认值。

标签: c++ templates sfinae enable-if


【解决方案1】:

只有在没有明确指定模板参数并且无法推导模板参数时才使用默认模板参数。对于这种情况,Y 可以从14.3 推导出为double,则不会使用默认参数。同样,在第一个示例中,您也可以通过指定模板参数绕过std::enable_if 的检查。

do_stuff<int, double>(15); // double

顺便说一句,您可以在类型声明中使用std::enable_if添加非类型模板参数,以使检查始终生效。

template <typename T, typename Y, typename std::enable_if<std::is_integral<T>::value, T>::type* = nullptr>
void do_stuff(T t, Y y)

【讨论】:

    猜你喜欢
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多