gpt4 book ai didi

c++ - 等效的 static_asserts 给出了 is_array<> 的冲突结果

转载 作者:太空狗 更新时间:2023-10-29 23:15:42 25 4
gpt4 key购买 nike

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

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_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)以使其按预期工作。

关于c++ - 等效的 static_asserts 给出了 is_array<> 的冲突结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28046474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com