Rumah > pembangunan bahagian belakang > C++ > Mengapa `std::vector::reference` Tidak Mengembalikan Rujukan `bool`?

Mengapa `std::vector::reference` Tidak Mengembalikan Rujukan `bool`?

DDD
Lepaskan: 2024-12-03 14:09:15
asal
651 orang telah melayarinya

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

Mengapa 'vector::reference' Tidak Mengembalikan Rujukan kepada 'bool'?

Pertimbangkan contoh berikut:

#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);
}
Salin selepas log masuk

Kod ini gagal disusun dengan yang berikut ralat:

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

Isu timbul kerana 'std::vector' ialah templat khusus untuk jenis 'bool'.

Pengkhususan Vektor untuk 'bool'

Dalam kes 'std::vector', ' std::vector' dikhususkan untuk jenis 'bool'. Ini bermakna mekanisme storan dan akses data asas secara khusus mengendalikan sifat binari nilai 'bool'. Akibatnya, 'std::vector::reference' tidak mengembalikan rujukan kepada objek 'bool' sebaliknya merujuk kepada perwakilan dalaman yang dioptimumkan untuk nilai 'bool'.

'fixed_vector' dan 'Boost Containers'

Untuk mengurangkan isu ini, anda boleh menggunakan yang berikut strategi:

  1. 'fixed_vector' Templat Metaprogramming: Tentukan metaprogram templat tersuai yang dipanggil 'fixed_vector' yang mengkhususkan 'std::vector' untuk 'bool' dan menggunakan 'char' sebagai jenis simpanan asas. Ini membolehkan anda mendapatkan semula rujukan kepada nilai 'char', yang boleh ditafsirkan sebagai nilai 'bool'.
  2. Pustaka 'Boost Containers': Gunakan perpustakaan 'Boost Containers', yang menyediakan versi tidak khusus 'std::vector' dan menyokong rujukan kepada nilai 'bool'.

Contoh Menggunakan '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);
}
Salin selepas log masuk

Contoh Menggunakan '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);
}
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa `std::vector::reference` Tidak Mengembalikan Rujukan `bool`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan