了解 "Expression does not compute the number of elements in this array"
Understanding "Expression does not compute the number of elements in this array"
使用 Apple Clang 12.0.0 编译此代码:
int my_array[10];
int arr_size = sizeof(my_array) / sizeof(decltype(my_array[0]));
得到这个 warning/error:
Expression does not compute the number of elements in this array; element type is 'int', not 'decltype(my_array[0])' (aka 'int &')
注意,这是简化的代码。在实际代码中,不是 'int' 而是 class 类型,而不是 '10' 而是一个表达式。
为什么我会收到此警告,在没有警告的情况下计算数组大小的正确方法是什么?
这是部分答案。
首先,decltype(my_array[0])
是 int& 而不是 int 类型并不奇怪。请记住,您可以分配给它并更改 my_array[0]
.
处的值
其次,无论如何你的代码应该是正确的,因为 sizeof
When applied to a reference type, the result is the size of the referenced type.
--cppreference.
现在我不确定为什么 clang 会报告警告。可能只是它将 T 和 T& 识别为传递给两个 sizeof
运算符的完全不同的类型,并且它们对常见的 sizeof(my_array)/sizeof(my_array[0])
模式有某种例外。
您是否尝试过 std::remove_reference_t 在您的 decltype 前面删除警告?或者只是按照评论中的建议删除 decltype?
更新
对于某些 C++ 风格点,您还可以完全放弃 sizeof 模式并使用元编程技术
template<typename T, size_t N>
size_t size_of_array( T (&_arr)[N]) {
return N;
}
您可以将其用作 size_of_array(my_array)
。
使用 Apple Clang 12.0.0 编译此代码:
int my_array[10];
int arr_size = sizeof(my_array) / sizeof(decltype(my_array[0]));
得到这个 warning/error:
Expression does not compute the number of elements in this array; element type is 'int', not 'decltype(my_array[0])' (aka 'int &')
注意,这是简化的代码。在实际代码中,不是 'int' 而是 class 类型,而不是 '10' 而是一个表达式。
为什么我会收到此警告,在没有警告的情况下计算数组大小的正确方法是什么?
这是部分答案。
首先,decltype(my_array[0])
是 int& 而不是 int 类型并不奇怪。请记住,您可以分配给它并更改 my_array[0]
.
其次,无论如何你的代码应该是正确的,因为 sizeof
When applied to a reference type, the result is the size of the referenced type. --cppreference.
现在我不确定为什么 clang 会报告警告。可能只是它将 T 和 T& 识别为传递给两个 sizeof
运算符的完全不同的类型,并且它们对常见的 sizeof(my_array)/sizeof(my_array[0])
模式有某种例外。
您是否尝试过 std::remove_reference_t 在您的 decltype 前面删除警告?或者只是按照评论中的建议删除 decltype?
更新 对于某些 C++ 风格点,您还可以完全放弃 sizeof 模式并使用元编程技术
template<typename T, size_t N>
size_t size_of_array( T (&_arr)[N]) {
return N;
}
您可以将其用作 size_of_array(my_array)
。