Heim >Backend-Entwicklung >C++ >Warum gibt „std::vector::reference' keine „bool'-Referenz zurück?

Warum gibt „std::vector::reference' keine „bool'-Referenz zurück?

DDD
DDDOriginal
2024-12-03 14:09:15559Durchsuche

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

Warum gibt „vector::reference“ keinen Verweis auf „bool“ zurück?

Betrachten Sie das folgende Beispiel:

#include <vector>

struct A
{
    void foo() {}
};

template<typename T>
void callIfToggled(bool v1, bool &v2, T &t)
{
    if (v1 != v2)
    {
        v2 = v1;
        t.foo();
    }
}

int main()
{
    std::vector<bool> v = {false, true, false};

    const bool f = false;
    A a;

    callIfToggled(f, v[0], a);
    callIfToggled(f, v[1], a);
    callIfToggled(f, v[2], a);
}

Dieser Code kann mit Folgendem nicht kompiliert werden Fehler:

dk2.cpp:29:28: error: no matching function for call to 'callIfToggled(const bool&, std::vector<bool>::reference, A&amp;)'

Das Problem tritt auf, weil 'std::vector' ist eine spezialisierte Vorlage für den Typ 'bool'.

Vektorspezialisierung für 'bool'

Im Fall von 'std::vector', ' std::vector' ist auf den Typ 'bool' spezialisiert. Dies bedeutet, dass die zugrunde liegenden Datenspeicher- und Zugriffsmechanismen speziell die binäre Natur von „Bool“-Werten verarbeiten. Daher gibt „std::vector::reference“ keinen Verweis auf ein „bool“-Objekt zurück, sondern einen Verweis auf eine interne Darstellung, die für „bool“-Werte optimiert ist.

'fixed_vector' und 'Boost Containers'

Um dieses Problem zu mildern, können Sie Folgendes verwenden Strategie:

  1. 'fixed_vector'-Vorlagen-Metaprogrammierung: Definieren Sie ein benutzerdefiniertes Vorlagen-Metaprogramm namens 'fixed_vector', das 'std::vector' für 'bool' spezialisiert und 'char' als verwendet der zugrunde liegende Speichertyp. Dadurch können Sie Verweise auf „char“-Werte abrufen, die als „bool“-Werte interpretiert werden können.
  2. 'Boost Containers'-Bibliothek: Verwenden Sie die 'Boost Containers'-Bibliothek, die Folgendes bereitstellt eine nicht spezialisierte Version von 'std::vector' und unterstützt Verweise auf „bool“-Werte.

Beispiel für die Verwendung von „fixed_vector“:

template<typename t, typename... p>
using fixed_vector = std::vector<typename foo<t>::type, p...>;

int main()
{
    fixed_vector<bool> v = {false, true, false};

    const bool f = false;
    A a;

    callIfToggled(f, v[0], a);
    callIfToggled(f, v[1], a);
    callIfToggled(f, v[2], a);
}

Beispiel für die Verwendung von „Boost Containers“:

#include <boost/container/vector.hpp>

int main()
{
    boost::container::vector<bool> v = {false, true, false};

    const bool f = false;
    A a;

    callIfToggled(f, v[0], a);
    callIfToggled(f, v[1], a);
    callIfToggled(f, v[2], a);
}

Das obige ist der detaillierte Inhalt vonWarum gibt „std::vector::reference' keine „bool'-Referenz zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn