결론
auto
는 const
타입을 없애버리지만, 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 는 임시객체 복제본을 할당받은 것이므로 이에 주의하여야 한다.
'개발언어 > C++' 카테고리의 다른 글
문자열 리터럴: char* vs char [] (0) | 2020.08.25 |
---|---|
String class 멤버함수 c_str()에서의 주의점 (0) | 2020.08.10 |
switch-case 문에서의 local variable 선언 (0) | 2020.08.08 |