결론

autoconst 타입을 없애버리지만, decltype(auto)const 타입을 유지한다.


다음과 같은 코드를 생각해 보자

#include <iostream>
#include <string>

const std::string _string("New string");

const std::string& func()
{
    return _string;
}

int main(void)
{
    auto str_auto = func();
    str_auto[0] = 'O';
    std::cout << "_string: " << _string << "\t str_auto:" << str_auto << std::endl;

/*
    decltype(auto) str_decl = func();
    str_decl[0] = 'O'; // 주석을 제거하면 이 부분에서 오류가 발생되어 컴파일되지 않음
    std::cout << "_string: " << _string << "\t str_auto:" << str_decl << std::endl;
*/
    return 0;
}

auto 가 const 한정자를 유지하고 있다면 위 str\_auto\[0\] = 'O'; 부분은 실행되지 않을 것이다. 하지만 위 실행의 결과는 다음과 같다.
_string: New string str\_auto:Oew string


다시말해 auto str_auto의 타입은 std::string 타입이고,
decltype(auto) str_decl의 타입은 const std::string& 타입이 된다.

따라서 위에서 auto str_auto 는 임시객체 복제본을 할당받은 것이므로 이에 주의하여야 한다.

+ Recent posts