c++ - 了解“表达式不计算此数组中的元素数”
问题描述
使用 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)
.
推荐阅读
- wordpress - 库存结束时更改按钮样式 Woocommerce
- node.js - 使用节点 8 LTS 安装 react 16 时,Contextify 和 Node Gyp 出错
- python - M2Crypto:试图解密 SMIME 字符串。没有内容类型错误
- postgresql - PostgreSQL 中最有效的数组表示法
- python - 通过检查连续元素对数据框进行切片
- sql - 雪花语法 - 语法中的意外空格字符
- c# - 在 C# 中使用 Gdal 库将 shapefile 转换为 kml
- laravel - Laravel-Excel 2,更快地插入数据
- javascript - 我应该在 Javascript 中使用多个变量还是单个对象?
- instrumentation - 使用 Pintool 检测时重复的函数调用