>백엔드 개발 >C++ >std::Vector와 함께 범위 기반 루프를 사용하면 컴파일러 오류가 발생하는 이유는 무엇입니까?

std::Vector와 함께 범위 기반 루프를 사용하면 컴파일러 오류가 발생하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-26 06:05:31672검색

Why Does Using Range-Based Loops with std::vector Result in a Compiler Error?

Range-for-Loops 및 std::Vector

C에서는 단순성과 가독성으로 인해 범위 기반 루프가 널리 보급되었습니다. 시퀀스의 요소나 컨테이너 객체를 반복적으로 반복합니다.

그러나 std::Vector와 함께 범위 기반 루프를 사용하려고 하면 이상한 불일치가 발생합니다. 다음 코드는 예상대로 작동합니다.

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

std::Vector와 함께 range-for-loops 사용 컴파일러 오류가 발생합니다.

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

오류 메시지 "'std::_Bit_iterator::reference {일명 std 유형의 rvalue에서 'std::_Bit_reference&' 유형의 비상수 참조 초기화가 잘못되었습니다. ::_Bit_reference}'"는 상수가 아닌 참조가 rvalue로 초기화되고 있음을 나타냅니다.

문제 이해

이 불일치의 이유는 std::벡터의 구현입니다. 각 정수를 별도로 저장하는 std::Vector와 달리 std::Vector은 다음과 같습니다. 메모리를 절약하기 위해 비트 패킹을 사용합니다. 결과적으로 해당 반복자는 개별 bool에 직접 액세스하지 않고 대신 기본 비트에 액세스하기 위한 프록시 역할을 하는 std::_Bit_reference에 대한 참조를 반환합니다.

해결책: auto&&& 사용

이 문제를 해결하려면 auto& 대신 auto&&&를 사용해야 합니다. 이 관용구는 lvalue(예: 첫 번째 예의 intVector)가 제공될 때 lvalue 참조에 대한 참조를 올바르게 축소하는 동시에 프록시가 제공되는 경우(boolVector의 경우) 임시 참조를 바인딩하고 활성 상태로 유지합니다.

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

이 기술을 사용하면 std::Vector 범위 기반 루프를 사용하여 해당 요소에 액세스합니다.

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

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