ホームページ > バックエンド開発 > C++ > `std::vector::reference` が `bool` 参照を返さないのはなぜですか?

`std::vector::reference` が `bool` 参照を返さないのはなぜですか?

DDD
リリース: 2024-12-03 14:09:15
オリジナル
621 人が閲覧しました

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' テンプレート メタプログラミング: 'std::vector' を 'bool' に特化し、'char を使用する 'fixed_vector' というカスタム テンプレート メタプログラムを定義します。 ' を基礎となるストレージ タイプとして使用します。これにより、「bool」値として解釈できる「char」値への参照を取得できます。
  2. 「Boost Containers」ライブラリ: を提供する「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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート