这里 "int[]" 的目的是什么:"std::void_t<int[static_cast<Int>(-1) < static_cast<Int>(0)]>;"
What is the purpose of "int[]" here: "std::void_t<int[static_cast<Int>(-1) < static_cast<Int>(0)]>;"
这是来自 std::enable_if
教程中的示例。
这里有更多的上下文:
// handle signed types
template<typename Int>
auto incr1(Int& target, Int amount)
-> std::void_t<int[static_cast<Int>(-1) < static_cast<Int>(0)]>;
- 不应该
std::void_t
接受一个类型作为模板参数吗?
- 在这种情况下
int[]
的目的是什么?
如果static_cast<Int>(-1) < static_cast<Int>(0)
产生true
,int[static_cast<Int>(-1) < static_cast<Int>(0)]
产生int[1]
(true
可能是converted到int
(然后 std::size_t
) 隐式地带有值 1
),这是一个数组类型。
如果 static_cast<Int>(-1) < static_cast<Int>(0)
产生 false
,int[static_cast<Int>(-1) < static_cast<Int>(0)]
产生 int[0]
(false
可能是 converted 到 int
(然后 std::size_t
) 隐式地使用值 0
),这是一个无效的数组类型并且 SFINAE 会从重载集中丢弃特化。 (array 的大小必须大于零(除非在 new[]-expression 中使用)。
int[0]
(int[false]
) 格式错误并被 SFINAE 拒绝。
可能更清楚的是:
std::enable_if_t<static_cast<Int>(-1) < static_cast<Int>(0)>
这是来自 std::enable_if
教程中的示例。
这里有更多的上下文:
// handle signed types
template<typename Int>
auto incr1(Int& target, Int amount)
-> std::void_t<int[static_cast<Int>(-1) < static_cast<Int>(0)]>;
- 不应该
std::void_t
接受一个类型作为模板参数吗? - 在这种情况下
int[]
的目的是什么?
如果static_cast<Int>(-1) < static_cast<Int>(0)
产生true
,int[static_cast<Int>(-1) < static_cast<Int>(0)]
产生int[1]
(true
可能是converted到int
(然后 std::size_t
) 隐式地带有值 1
),这是一个数组类型。
如果 static_cast<Int>(-1) < static_cast<Int>(0)
产生 false
,int[static_cast<Int>(-1) < static_cast<Int>(0)]
产生 int[0]
(false
可能是 converted 到 int
(然后 std::size_t
) 隐式地使用值 0
),这是一个无效的数组类型并且 SFINAE 会从重载集中丢弃特化。 (array 的大小必须大于零(除非在 new[]-expression 中使用)。
int[0]
(int[false]
) 格式错误并被 SFINAE 拒绝。
可能更清楚的是:
std::enable_if_t<static_cast<Int>(-1) < static_cast<Int>(0)>