Это правильно, так как она использует метапрограммирование как это:
template <typename T, std::size_t N>
inline std::size_t array_size(T (&)[N]) {
return N;
};
Вы должны знать, что это работает, когда компилятор видит определение массива, но не после того, как он был передан в функцию (где он распадается на указатель):
void f(int array[])
{
//std::cout << array_size(array) << std::endl; // fails, at this point array is a pointer
std::cout << sizeof(array)/sizeof(array[0]) << std::endl; // fails: sizeof(int*)/sizeof(int)
}
int main()
{
int array[] = { 1, 2, 3, 4, 5 };
f(array);
std::cout << array_size(array) << std::endl; // 5
std::cout << sizeof(array)/sizeof(array[0]) << std::endl; // 5
}
Да, я тоже поступаю так же, Как и вы, я жду, чтобы увидеть, есть ли другие способы. –
Переименование этого вопроса на «Длина массива в C» может быть хорошей идеей. –
Это не «определение» длины во время выполнения; длина является константой времени компиляции, и данное выражение является постоянным, поэтому компилятор может просто оценить его во время компиляции и подставить правильное значение. Кроме того, рассмотрите возможность отбрасывания скобок; sizeof не является функцией. – unwind