Skip to content

C++:RangeBasedFor

Example

for (int i : m_Table) { // 테이블 내의 int 형 전부 다 돌음
    std::cout << i << " ";
}

auto warning

auto를 사용할 경우 주의해야할 사항이 있다. 우선 아래 예제를 보자.

#include <iostream>
#include <vector>
#include <type_traits>

struct Temp
{
    Temp() {
        std::cout << "DEFAULT\n";
    }
    Temp(Temp const & obj) {
        std::cout << "COPY\n";
    }
    Temp(Temp && obj) {
        std::cout << "MOVE\n";
    }
    ~Temp() {
        std::cout << "REMOVE\n";
    }
    Temp & operator=(Temp const & obj) {
        std::cout << "COPY =\n";
        return *this;
    }
    Temp & operator=(Temp && obj) {
        std::cout << "MOVE =\n";
        return *this;
    }
};

int main()
{
    std::vector<Temp> test(1);

    std::cout << "START FOR\n";
    for (auto cursor : test) {
        std::cout << "IS_REFERENCE: " << std::is_reference<decltype(cursor)>::value << std::endl;
        std::cout << "IS_RVALUE_REFERENCE: " << std::is_rvalue_reference<decltype(cursor)>::value << std::endl;
    }
    std::cout << "END FOR\n";

    return 0;
}

OUTPUT:

DEFAULT
START FOR
COPY
IS_REFERENCE: 0
IS_RVALUE_REFERENCE: 0
REMOVE
END FOR
REMOVE

위의 경우 for문에 있는 auto변수는 lvalue로, copy operator가 발생한다. 따라서 for (auto & cursor : test)와 같이 reference로 루프를 돌려야 한다. 해당 코드를 변경한 후 컴파일한 결과는 아래와 같다.

DEFAULT
START FOR
IS_REFERENCE: 1
IS_RVALUE_REFERENCE: 0
END FOR
REMOVE

Favorite site