Рассмотрим следующий фрагмент кода, который идеально подходит компилятору С++ 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::array
s? -
Существуют ли какие-либо ценные виды использования?