Есть ли причина для нулевого размера std :: array в C ++ 11?
Рассмотрим следующий фрагмент кода, который вполне приемлем для компилятора C ++ 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
s вполне допустимы в C ++ 11, в отличие от массивов нулевого размера (например,int A[0];
) где они явно запрещены, но некоторые компиляторы (например, GCC) допускают их за счет неопределенного поведения.
Учитывая это «противоречие», у меня возникают следующие вопросы:
Почему комитет C ++ решил разрешить нулевой размерstd::array
s?
Есть ли какие-либо ценные использования?