Рассмотрим следующий фрагмент кода, который идеально подходит компилятору С++ 11:
#include <array>
#include <iostream>
auto main() -> int {
std::array<double, 0> A;
for(auto i : A) std::cout << i << std::endl;
return 0;
}
В соответствии со стандартом § 23.3.2.8 [Массивы с нулевым размером]:
1Массив должен поддерживать специальный случайN == 0.
2В случае, когдаN == 0,begin() == end() ==уникальное значение. Возвращаемое значениеdata()не задано.
3Невозможно выполнить вызов вызоваfront()илиback()для массива нулевого размера.
4Функция-членswap()должна иметь noexcept-спецификацию, которая эквивалентнаnoexcept(true).
Как показано выше, нулевой размер std::array вполне допустим в С++ 11, в отличие от массивов нулевого размера (например, int A[0];), где они явно запрещены, но они разрешены некоторыми компиляторами (например, GCC) в стоимости undefined поведения.
Учитывая это "противоречие", у меня есть следующие вопросы:
-
Почему комитет С++ решил разрешить нулевой размер
std::arrays? -
Существуют ли какие-либо ценные виды использования?