std::enable_if_t = 0 是什么意思

Bin*_*hao 3 c++

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

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

由于 std::enable_if_t 是一个类型,并且它可以被评估为intor voidfor 这种情况,所以上面的代码可以评估为

template <typename Integer,
          int = 0
>
T(Integer) : m_type(int_t) {}
Run Code Online (Sandbox Code Playgroud)

或者

template <typename Integer,
          void = 0
>
T(Integer) : m_type(int_t) {}
Run Code Online (Sandbox Code Playgroud)

我不明白,int = 0或者void = 0有人能帮我解决这个问题吗?谢谢。

Nat*_*ica 7

由于std::enable_if_t是一个类型,并且它可以被评估为intorvoid对于这种情况,所以上面的代码可以被评估为...

这是不正确的。随着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) {}
Run Code Online (Sandbox Code Playgroud)

whereint = 0只是一个未命名的非类型模板参数,其值为0。

我们这样做的原因= 0是它有一个默认值,并且在声明这种类型的对象时我们不需要将值传递给它。没有它,您根本无法使用此构造函数,因为无法指定构造函数的模板参数。即使这不是构造函数,您仍然希望使用默认值,这样用户就不需要将不需要的值传递给未命名和未使用的模板参数。