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
553 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!

sumber:php.cn
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