Массив нулевого размера допустим только в 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 ++, почему такое поведение необходимо?

Ответы на вопрос(6)

Ваш ответ на вопрос