等效static_asserts为is_array<>提供相互矛盾的结果

Equivalent static_asserts giving conflicting results for is_array<>

本文关键字:相互矛盾 结果 gt static is array 等效 lt asserts      更新时间:2023-10-16

在以下代码片段中,一个静态断言通过,另一个失败:

template <class Rng> constexpr bool is_array(Rng&& r) {
  // int*** debug = r;  // uncomment this to debug r's type
  return std::is_array<Rng>{};
  // return std::is_array<decltype(r)>{};  // fails too
}
int a[5] = {0, 1, 2, 3, 4};
static_assert(std::is_array<decltype(a)>{}, ""); // passes
static_assert(is_array(a), ""); // fails

提示:删除注释以调试类型(正确推断为int [5])。

这是为什么呢?在叮当树干上测试。

我猜这与数组以某种方式衰减成指针有关。

解决方案:使用 std::remove_reference_tRng将被int (&)[5],这是对数组的引用,而不是数组。

Xeo补充说:

template<class> struct dump;
dump<decltype(r)>{};

将无法编译并显示正确的r类型。

int**** j = r;产生了错误的错误(说不能断言int[5] int****)。

Rng的类型是int (&)[5],它是对数组(而不是数组)的引用,因此std::is_array返回false_type

可以删除引用(例如使用 std::remove_reference_t )以使其按预期工作。