La raison principale serait que std::vector<bool>
est spécial, et sa spécification permet spécifiquement une mise en œuvre pour minimiser l'utilisation de la mémoire.
Pour les vecteurs d'autre chose que bool
, le type de référence peut effectivement être une véritable référence (à savoir std::vector<int>::reference
peut effectivement être un int &
) - généralement directement référence à un élément du vecteur lui-même. Il est donc logique que le type de référence prenne en charge toutes les opérations que peut effectuer le type sous-jacent. Cela fonctionne car vector<int>
gère efficacement un tableau contigu de int
en interne. La même chose vaut pour tous les types autres que bool
. Cependant, pour minimiser l'utilisation de la mémoire, un std::vector<bool>
peut ne pas (en fait probablement ne fonctionnera pas) fonctionner en interne avec un tableau réel de bool
. Au lieu de cela, il peut utiliser une structure de données empaquetée, telle qu'un tableau de unsigned char
en interne, où chaque unsigned char
est un bitfield contenant 8
bits. Donc un vector<bool>
de longueur 800 gèrerait réellement un tableau de 100
char non signé, et la mémoire qu'il consomme serait 100
octets (en supposant qu'il n'y ait pas de surallocation). Si le vector<bool>
contenait en fait un tableau de 800
bool
, son utilisation de la mémoire serait un minimum de 800
octets (puisque sizeof (bool) doit être au moins 1
, par définition).
pour permettre une telle optimisation de la mémoire par les opérateurs de vector<bool>
, le type de retour de vector<bool>::operator[]
(à savoir std::vector<bool>::reference
) ne peut pas être simplement un bool &
. En interne, il contient probablement une référence au type sous-jacent (par exemple, un unsigned char
) et des informations permettant de suivre le bit qu'il affecte réellement. Ceci rendrait tous les opérateurs op =
(+=
, -=
, |=
, etc.) des opérations quelque peu coûteuses (par exemple, un médiateur de bits) sur le type sous-jacent.
Les concepteurs de std::vector<bool>
auraient alors dû faire un choix entre
précise que std::vector<bool>::reference
soutenir tous les op =
et entendre les plaintes continuelles au sujet de l'inefficacité de l'exécution de programmeurs qui utilisent ces opérateurs
Ne soutenez pas ces op =
et les plaintes de terrain des programmeurs qui pensent que de telles choses sont correctes ("code propre", etc) même si elles seront inefficaces.
Il semble que les concepteurs de std::vector<bool>
ont opté pour l'option 2. Une conséquence est que les seuls opérateurs d'affectation pris en charge par std::vector<bool>::reference
sont le stock norme operator=()
(avec opérandes soit de type reference
, ou de type bool
) pas de l'op =
. L'avantage de ce choix est que les programmeurs obtiennent une erreur de compilation s'ils essaient de faire quelque chose qui est en fait un mauvais choix dans la pratique.
Après tout, bien que bool
supporte tous les op =
en les utilisant ne réalise pas beaucoup de toute façon. Par exemple, some_bool |= true
a le même effet net que some_bool = true
.
Vous pouvez toujours faire 'enable [0] = enable [0] | ... '. –
Pourquoi ne pas utiliser un ['bitset'] (http://en.cppreference.com/w/cpp/utility/bitset) – Borgleader
@Borgleader dans mon code réel la longueur est dynamique – Amxx