Considérons le morceau de code suivant, qui est parfaitement acceptable par un compilateur 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;
}
Selon la norme § 23.3.2.8 [ Tableaux de taille zéro ] :
1
Array doit fournir un support pour le cas particulierN == 0
.
2
Dans le cas oùN == 0
,begin() == end() ==
valeur unique. La valeur de retour dedata()
n'est pas spécifié.
3
L'effet de l'appelfront()
oback()
pour un tableau de taille nulle est indénié.
4
Fonction de membreswap()
doit avoir une spécification noexcept qui est équivalente ànoexcept(true)
.
Comme indiqué ci-dessus, la taille zéro std::array
sont parfaitement autorisés en C++11, contrairement aux tableaux de taille nulle (par ex, int A[0];
) où ils sont explicitement interdits, mais ils sont autorisés par certains compilateurs (par exemple, GCC) au prix d'un comportement indéfini.
Compte tenu de cette "contradiction", je me pose les questions suivantes :
-
Pourquoi le comité C++ a décidé d'autoriser la taille zéro ?
std::array
s ? -
Y a-t-il des utilisations utiles ?
20 votes
Probablement pour être cohérent avec les conteneurs et faciliter certaines choses génériques.
1 votes
Une considération pourrait être que même si des implémentations ont des difficultés avec les tableaux de taille zéro, elles ne devraient pas avoir de difficultés avec une spécialisation partielle pour les tableaux de taille zéro.
std::array<T, 0>
.2 votes
Les méta-programmes de modèles sont souvent récursifs, et il est souvent plus simple de faire en sorte que la récursion se termine à 0 plutôt qu'à 1... Mais j'admets que j'ai du mal à construire un exemple réaliste dans ce cas...
0 votes
Qu'en est-il du retour d'une fonction ? Disons qu'une fonction a un type de retour tableau mais a la possibilité de ne rien retourner. Un tableau de longueur nulle serait utile parce que vous pouvez vérifier
array.empty()
16 votes
Le zéro est un nombre naturel parfait. Ce serait bizarre si tu ne pouvait pas ont des tableaux de taille nulle. Le fait que les tableaux C n'autorisent pas la taille zéro est plus une limitation pragmatique que souhaitable en soi. Y a-t-il des cas d'utilisation ? Oui, cela signifie que vous n'avez pas besoin de mettre en cas particulier de nombreuses constructions génériques.
0 votes
Pour autant que je sache,
std::array<T,0>
n'a aucune valeur pratique.3 votes
@KerrekSB Zero n'est pas une naturel numéro. Uniquement les nombres entiers et non négatifs.
6 votes
@SargeBorsch en fait, ça dépend de la définition que vous choisissez et cela dépend beaucoup de raisons pratiques.
1 votes
@SargeBorsch : M. Peano ne serait pas d'accord :-S
0 votes
@Davidmh cela signifie que l'utilisation de ce nom devrait être évitée, car il est ambigu.