std::enable_if_t = 0 的意思是什么?

7

我正在阅读 std::enable_if,并注意到以下内容。

template <typename Integer,
          std::enable_if_t<std::is_integral<Integer>::value, int> = 0
>
T(Integer) : m_type(int_t) {}

由于 std::enable_if_t 是一种类型,对于这种情况它可以被计算为 intvoid。因此上述代码可以被计算为:

template <typename Integer,
          int = 0
>
T(Integer) : m_type(int_t) {}

或者

template <typename Integer,
          void = 0
>
T(Integer) : m_type(int_t) {}

我不理解 int = 0 或者 void = 0 的意思,请问有人能帮我解释一下吗?谢谢。

1个回答

14
由于std::enable_if_t是一种类型,对于这种情况,它可以被评估为intvoid,因此上述代码可以被评估为... 这并不正确。使用std::enable_if_t<std::is_integral<Integer>::value, int>std::enable_if_t唯一的类型只能是int。如果std::is_integral<Integer>::value不为真,则根本没有成员,模板实例化被丢弃。这意味着它只解析为
template <typename Integer,
          int = 0
>
T(Integer) : m_type(int_t) {}

其中int = 0是一个未命名的无类型模板参数,其值为0

我们之所以使用= 0是为了给它一个默认值,在声明此类型对象时不需要传递值。如果没有默认值,您将无法使用此构造函数,因为没有办法指定构造函数的模板参数。即使这不是构造函数,您仍然希望使用默认值,以便用户不需要传递不需要的值到该未命名的和未使用的模板参数中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接