>  기사  >  백엔드 개발  >  범위 기반 For 루프가 `std::Vector`와 다르게 동작하는 이유는 무엇입니까?

범위 기반 For 루프가 `std::Vector`와 다르게 동작하는 이유는 무엇입니까?

DDD
DDD원래의
2024-10-30 04:06:02948검색

Why Do Range-Based For Loops Behave Differently with `std::vector`?

Range-for-Loops 및 std::Vector

표준 라이브러리 컨테이너와 함께 범위 기반 for 루프를 사용하는 경우 반복자의 데이터 유형은 종종 카운터 변수의 데이터 유형을 나타냅니다. 그러나 std::Vector의 경우 기본 저장 메커니즘으로 인해 고유한 동작이 발생합니다.

첫 번째 예에서는

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

std::Vector< ;정수> 정수를 포함하므로 반복자 유형은 std::Vector::iterator입니다. 이 반복자는 T&를 역참조합니다. 이 경우 int&는 int& 유형의 카운터 변수를 만듭니다.

이제 두 번째 예를 고려해 보겠습니다.

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

여기서 std는 다음과 같습니다. :벡터 정수로 압축된 형식으로 저장되는 bool을 포함합니다. 반복자 유형은 std::_Bit_reference라고도 알려진 std::Vector::reference를 역참조하는 std::Vector::iterator입니다. 이 참조 유형은 rvalue(임시)이며 const가 아닌 참조에 바인딩될 수 없습니다. 이로 인해 컴파일 오류가 발생합니다.

<code class="text">invalid initialization of non-const reference of type ‘std::_Bit_reference&amp;’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’</code>

해결책은 auto&&를 사용하는 것입니다. 이는 lvalue 참조인 경우 lvalue 참조에 바인딩하고, 임시인 경우 rvalue의 임시 복사본을 만듭니다.

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

이러한 수정을 통해 코드는 예상대로 boolVector의 내용을 출력합니다.

위 내용은 범위 기반 For 루프가 `std::Vector`와 다르게 동작하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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