Gibt es einen Grund für ein std :: array mit der Größe Null in C ++ 11?
Betrachten Sie den folgenden Code, der von einem C ++ 11-Compiler durchaus akzeptiert wird:
#include <array>
#include <iostream>
auto main() -> int {
std::array<double, 0> A;
for(auto i : A) std::cout << i << std::endl;
return 0;
}
Nach der Norm § 23.3.2.8 [Arrays ohne Größe]:
1
Array soll den Sonderfall unterstützenN == 0
.
2
In diesem FallN == 0
, begin() == end() ==
Einzigartiger Wert. Der Rückgabewert vondata()
ist nicht spezifiziert.
3
Die Wirkung von Anrufenfront()
oderback()
für ein Array mit der Größe Null ist nicht definiert.
4
Mitgliedsfunktionswap()
muss eine No-Except-Spezifikation haben, die äquivalent ist zunoexcept(true)
.
Wie oben angezeigt, Größe Nullstd::array
s sind in C ++ 11 im Gegensatz zu Arrays mit der Größe Null (z. B.int A[0];
), wo sie ausdrücklich verboten sind, jedoch von einigen Compilern (z. B. GCC) als Kosten für undefiniertes Verhalten zugelassen werden.
Angesichts dieses "Widerspruchs" habe ich folgende Fragen:
Warum das C ++ - Komitee beschlossen hat, die Größe Null zuzulassenstd::array
s?
Gibt es wertvolle Verwendungen?