等效 static_asserts 为 is_array<> 给出相互矛盾的结果
Equivalent static_asserts giving conflicting results for is_array<>
在以下代码片段中,一个静态断言通过,另一个失败:
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]
)。
这是为什么?在 clang 主干上测试。
我猜这与数组衰减成指针有关..不知何故。
解决方案:使用std::remove_reference_t
,Rng
将是int (&)[5]
,这是对数组的引用,而不是数组。
Xeo 添加:
template<class> struct dump;
dump<decltype(r)>{};
将无法编译并显示 r
的正确类型。
int**** j = r;
产生了一个错误的错误(说不能将 int[5]
赋给 int****
)。
Rng
的类型是 int (&)[5]
,它是对数组(而不是数组)的引用,因此 std::is_array
returns false_type
。
可以删除引用(例如使用 std::remove_reference_t
)以使其按预期工作。
在以下代码片段中,一个静态断言通过,另一个失败:
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]
)。
这是为什么?在 clang 主干上测试。
我猜这与数组衰减成指针有关..不知何故。
解决方案:使用std::remove_reference_t
,Rng
将是int (&)[5]
,这是对数组的引用,而不是数组。
Xeo 添加:
template<class> struct dump;
dump<decltype(r)>{};
将无法编译并显示 r
的正确类型。
int**** j = r;
产生了一个错误的错误(说不能将 int[5]
赋给 int****
)。
Rng
的类型是 int (&)[5]
,它是对数组(而不是数组)的引用,因此 std::is_array
returns false_type
。
可以删除引用(例如使用 std::remove_reference_t
)以使其按预期工作。