微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

理解“表达式不计算此数组中的元素数”

如何解决理解“表达式不计算此数组中的元素数”

使用 Apple Clang 12.0.0 编译此代码

int my_array[10];
int arr_size = sizeof(my_array) / sizeof(decltype(my_array[0]));

并收到此警告/错误

Expression does not compute the number of elements in this array; element type is 'int',not 'decltype(my_array[0])' (aka 'int &')

注意,这是简化的代码。在真正的代码中,不是 'int' 而是一个类类型,而不是 '10' 是一个表达式。

为什么我会收到此警告,在没有警告的情况下计算数组大小的正确方法是什么?

解决方法

这是部分答案。

首先,decltype(my_array[0]) 是 int& 而不是 int 类型并不奇怪。请记住,您可以为其分配并更改 my_array[0] 处的值。

其次,您的代码无论如何都应该是正确的,因为对于 sizeof

当应用于引用类型时,结果是引用类型的大小。 --cppreference

现在我不确定为什么clang会报告警告。可能只是它将 T 和 T& 识别为传递给两个 sizeof 运算符的完全不同的类型,并且它们对常见的 sizeof(my_array)/sizeof(my_array[0]) 模式存在某种异常。

您是否尝试过在 decltype 前面使用 std::remove_reference_t 来删除警告?或者只是按照评论中的建议删除 decltype?

更新 对于某些 C++ 样式点,您还可以完全放弃 sizeof 模式并使用元编程技术

template<typename T,size_t N>
size_t size_of_array( T (&_arr)[N]) {
   return N;
}

您可以将其用作 size_of_array(my_array)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。