> 백엔드 개발 > C++ > 본문

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

Linda Hamilton
풀어 주다: 2024-10-27 07:45:31
원래의
462명이 탐색했습니다.

Why Does Using a Range-Based For Loop With std::vector<bool> C에서 오류가 발생합니까? 
C에서 오류가 발생합니까? " />

Range-for-Loops 및 std::Vector

C에서 범위 기반 for 루프는 컨테이너의 요소를 반복하는 편리한 방법을 제공합니다. 그러나 부울 값의 컨테이너와 함께 사용하면 특정 동작이 이상해 보일 수 있습니다.

문제

다음 코드를 고려하세요.

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

std::vector<bool> boolVector(10);
for (auto& i : boolVector)
    std::cout << i;</code>
로그인 후 복사

첫 번째 루프는 intVector를 성공적으로 반복하고 그러나 두 번째 루프에서는 다음 오류가 발생합니다.

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}’
for (auto& i : boolVector)
로그인 후 복사

이유

이 오류는 std::Vector 해당 요소를 개별 메모리 위치에 보관하는 대신 부울 값을 정수(부울당 32비트)로 압축합니다. 결과적으로 반복자는 비트 마스킹을 통해 개별 부울 값에 대한 액세스를 제공하는 프록시 객체를 반환합니다.

해결책

std::Vector을 반복하려면 올바른 구문은 auto&&를 사용하는 것입니다. 이는 주어진 경우 lvalue 참조에 바인딩하거나 경우에 따라 임시 프록시를 유지합니다. :

<code class="cpp">for (auto&& i : boolVector)
    std::cout << i;</code>
로그인 후 복사

auto&&를 사용하면 컴파일러는 실제 부울 값 참조가 제공되면 lvalue 참조로 올바르게 축소되거나 프록시에 대한 참조가 제공되면 임시 프록시를 바인딩하고 활성 상태로 유지합니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!