这里 "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)]>;

From

  1. 不应该 std::void_t 接受一个类型作为模板参数吗?
  2. 在这种情况下 int[] 的目的是什么?

如果static_cast<Int>(-1) < static_cast<Int>(0)产生trueint[static_cast<Int>(-1) < static_cast<Int>(0)]产生int[1]true可能是convertedint(然后 std::size_t) 隐式地带有值 1),这是一个数组类型。

如果 static_cast<Int>(-1) < static_cast<Int>(0) 产生 falseint[static_cast<Int>(-1) < static_cast<Int>(0)] 产生 int[0]false 可能是 convertedint(然后 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)>