Maison >développement back-end >C++ >Pourquoi `std::vector::reference` ne renvoie-t-il pas un `bool&` ?

Pourquoi `std::vector::reference` ne renvoie-t-il pas un `bool&` ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-09 00:42:10830parcourir

Why Doesn't `std::vector::reference` Return a `bool&`?

Pourquoi vector::reference ne renvoie pas de référence à Bool ?

En C , le std::vector

Le problème

Dans l'exemple fourni, une fonction callIfToggled est utilisée pour basculer une valeur booléenne et appeler une méthode sur une structure. Lorsque vous tentez de transmettre une référence à un élément d'un fichier std::vector à callIfToggled, une erreur de compilation se produit. En effet, le type de référence renvoyé par vector::reference n'est pas le bool& attendu.

La raison

Dans la spécialisation de vecteur bool, vector

Solutions

  • Utilisez le vecteur Au lieu de cela : Remplacez le vecteur booléen par un vecteur pour contourner le problème de spécialisation.

  • Utiliser la bibliothèque Boost Containers : La bibliothèque Boost Containers fournit une version non spécialisée de vector qui offre une véritable référence aux valeurs bool.
  • Envelopper les valeurs bool dans une structure : Créez une structure wrapper autour de bool appelée MyBool. Cela permet de transmettre une référence au wrapper, qui à son tour fournit un accès indirect à la valeur booléenne sous-jacente.
  • Exemple (Vector of Char) :

    #include <vector>
    
    struct A
    {
        void foo() {}
    };
    
    template<typename T>
    void callIfToggled(char v1, char &v2, T &t)
    {
        if (v1 != v2)
        {
            v2 = v1;
            t.foo();
        }
    }
    
    int main()
    {
        std::vector<char> v = { false, true, false };
    
        const char f = false;
        A a;
    
        callIfToggled(f, v[0], a);
        callIfToggled(f, v[1], a);
        callIfToggled(f, v[2], a);
    }

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn