Rozważmy następujący fragment kodu, który jest w pełni do zaakceptowania przez kompilator C++ 11:Czy istnieje przyczyna zerowej wielkości std :: array w 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;
}
Zgodnie z normą § 23.3.2.8 [zerowej wielkości tablice]:
1
Array zapewnia obsługę specjalnego przypadkuN == 0
.
2
W przypadku, gdyN == 0
,begin() == end() ==
wartość unikalna. Wartość zwracana
data()
jest nieokreślona.
3
Efekt dzwonienia pod numerfront()
lubback()
w przypadku macierzy o rozmiarze zerowym jest nieskończony.
4
Funkcja członkaswap()
będzie miała specyfikację noexcept, która jest równoważna znoexcept(true)
.
Jak wyświetlane powyżej, zero wielkości std::array
s są całkowicie dopuszczalne w C++ 11, w przeciwieństwie do zera tablic wielkości (np int A[0];
), gdzie są wyraźnie zabronione, ale są one dopuszczone przez niektóre kompilatory (np GCC) w kosztach niezdefiniowanego zachowania.
Biorąc pod uwagę ten "sprzeczność", mam następujące pytania:
Dlaczego C++ komisja postanowiła zezwolić zerowej wielkości
std::array
s?Czy są jakieś cenne zastosowania?
Prawdopodobnie będzie to zgodne z pojemnikami i ułatwi wykonywanie niektórych ogólnych rzeczy. – chris
Jedna uwaga może być taka, że nawet jeśli dowolne implementacje mają trudności z macierzami o zerowej wielkości, nie powinny mieć trudności z częściową specjalizacją dla 'std :: array'. –
hvd
Meta-programy szablonów są często rekursywne i często najprościej jest mieć dno rekursji na poziomie 0 zamiast 1 ... Ale przyznaję, że mam problem z konstruowaniem realistycznego przykładu w tym przypadku. – Nemo