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