我正在阅读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有人能帮我解决这个问题吗?谢谢。
由于
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是它有一个默认值,并且在声明这种类型的对象时我们不需要将值传递给它。没有它,您根本无法使用此构造函数,因为无法指定构造函数的模板参数。即使这不是构造函数,您仍然希望使用默认值,这样用户就不需要将不需要的值传递给未命名和未使用的模板参数。
| 归档时间: |
|
| 查看次数: |
485 次 |
| 最近记录: |