Массив нулевого размера допустим только в C как последний элемент atruct. Все остальное бессмысленно.
авно написал шаблон функции, который принимает ссылку на C-массив:
template <class T, size_t N>
void foo(T(&c_array)[N]);
Предполагая, что Т являетсяchar
длина C-строкиN - 1
из-за нулевого терминатора. Я понял, что мне, вероятно, стоит занятьсяN == 0
потому что тогдаN - 1
было быstd::numeric_limits<std::size_t>::max()
.
Поэтому, чтобы избежать хаоса, который может возникнуть в редком случае, когда кто-то передает массив нулевой длины в эту функцию, я поставил проверку дляN == 0
.
Однако, к моему удивлению, кажется, что массив нулевой длины на самом деле даже не тип массива - или, по крайней мере, это то, во что, похоже, верит GCC. На самом деле, массив нулевой длины даже непривязывать на указанную выше сигнатуру функции, если функция с сигнатурой типа указателя доступна в качестве кандидата.
Рассмотрим следующий код:
template <class T, size_t N>
void foo(T(&array)[N])
{
std::cout << "Array" << std::endl;
}
void foo(const void* p)
{
std::cout << "Pointer" << std::endl;
}
int main(int argc, char** argv)
{
char array1[10] = { };
const char* pointer = 0;
char array2[0] = { };
foo(array1);
foo(pointer);
foo(array2);
}
С GCC 4.3.2 это выводит:
Array
Pointer
Pointer
Как ни странно, массив нулевой длины предпочитает связывать с функцией, которая принимаеттип указателя, Итак, это ошибка в GCC или есть какая-то неясная причина, предписанная стандартом C ++, почему такое поведение необходимо?