>  기사  >  백엔드 개발  >  `std::Vector`에서 범위 기반 For 루프를 사용하면 오류가 발생하는 이유는 무엇입니까?

`std::Vector`에서 범위 기반 For 루프를 사용하면 오류가 발생하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-26 03:57:02907검색

Why Does Using a Range-Based For Loop on `std::vector` Cause an Error?

Range-for-Loop 및 std::Vector

C에서 범위 기반 for 루프는 반복을 단순화합니다. 컨테이너. 그러나 std::Vector과 같은 특정 컨테이너 유형에서 이러한 루프를 사용하려고 하면 예기치 않은 동작이 발생할 수 있습니다.

다음 코드 조각을 고려하세요.

<code class="cpp">std::vector<int> intVector(10);
for(auto& i : intVector)
    std::cout << i;</code>

이 코드 intVector 컬렉션을 반복하고 각 요소를 인쇄합니다. 그러나 intVector를 std::Vector boolVector:

<code class="cpp">std::vector<bool> boolVector(10);
for(auto& i : boolVector)
    std::cout << i;</code>

수정된 코드로 인해 오류가 발생합니다.

error: invalid initialization of non-const reference of type ‘std::_Bit_reference&’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’

기본 메커니즘:

std::로 인해 불일치가 발생합니다. 벡터 다른 벡터 유형과 다르게 작동합니다. 대부분의 std::Vector 변형에서 반복자는 요소 유형의 참조를 가리키므로 auto&를 통해 직접 액세스하고 수정할 수 있습니다. 그러나 std::Vector의 경우는 그렇지 않습니다.

std::Vector 부울 값을 정수로 압축하여 효율적으로 저장합니다. 결과적으로 반복자는 부울 값을 검색하기 위해 비트 조작을 수행하는 특수 프록시 객체를 반환합니다. 이 프록시는 lvalue 참조(auto&)에 바인딩될 수 없는 rvalue(임시)입니다.

해결책:

이 문제를 해결하려면 범위에서 auto&&&를 사용하세요. 기반 루프:

<code class="cpp">for(auto&& i : boolVector)
    std::cout << i;</code>

auto&&& 구문은 반복자 참조 유형을 확인합니다. lvalue 참조인 경우 동일하게 유지됩니다. 그렇지 않으면 임시 프록시에 바인딩하고 보존하여 코드가 올바르게 실행될 수 있도록 합니다.

위 내용은 `std::Vector`에서 범위 기반 For 루프를 사용하면 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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