>백엔드 개발 >C++ >`std::Vector::reference`가 `bool` 참조를 반환하지 않는 이유는 무엇입니까?

`std::Vector::reference`가 `bool` 참조를 반환하지 않는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-03 14:09:15563검색

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

왜 '벡터::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::벡터'는 'bool' 유형에 특화되어 있습니다. 이는 기본 데이터 저장 및 액세스 메커니즘이 'bool' 값의 이진 특성을 구체적으로 처리한다는 것을 의미합니다. 결과적으로 'std::Vector::reference'는 'bool' 객체에 대한 참조를 반환하지 않고 오히려 'bool' 값에 최적화된 내부 표현에 대한 참조를 반환합니다.

'fixed_Vector' 및 'Boost Containers'

이 문제를 완화하려면 다음을 사용할 수 있습니다. 전략:

  1. 'fixed_Vector' 템플릿 메타프로그래밍: 'bool'에 대해 'std::Vector'를 전문화하고 '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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.