首頁 >後端開發 >C++ >為什麼 `std::vector::reference` 不回傳 `bool` 引用?

為什麼 `std::vector::reference` 不回傳 `bool` 引用?

DDD
DDD原創
2024-12-03 14:09:15554瀏覽

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

為什麼 'vector::reference' 不回傳 'bool' 的引用?

考慮以下範例:

#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);
}

此程式碼無法透過以下方式編譯錯誤:

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

出現此問題是因為'std::vector '是'bool' 類型的專用範本。

'bool' 的向量專用化

在'std::vector' 的情況下,' std::vector' 專門用於'bool ' 類型。這意味著底層資料儲存和存取機制專門處理“bool”值的二進位性質。因此,「std::vector::reference」不會傳回對「bool」物件的引用,而是傳回針對「bool」值最佳化的內部表示的參考。

'fixed_vector' 和'Boost Containers'

要緩解此問題,您可以使用以下命令策略:

  1. 'fixed_vector' 模板元程式設計:
  2. 定義一個名為'fixed_vector' 的自訂模板元程序,專門針對 'bool' 指定 'std::vector' 並使用 'char' 作為底層儲存類型。這允許您檢索對“char”值的引用,該值可以解釋為“bool”值。
  3. 「Boost Containers」函式庫:
  4. 使用「Boost Containers」函式庫,它提供'std::vector' 的非專業化版本並支援對「bool」值的引用。

使用「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);
}

使用「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);
}

以上是為什麼 `std::vector::reference` 不回傳 `bool` 引用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn