728x90

특징

- 일종의 조커카드로 타입을 명시적으로 지정하지 않아도 타입을 추론 가능하게 하는 타입이다. 이를 형식추론 혹은 형식연역(type deduction, type inference)

- c+14 에서 함수 리턴값으로 auto 키워드가 사용 가능

 

주의

const나 &가 붙은 타입은 auto로 정확하게 타입추론이 되지 않는다. 보통 const나 &를 무시한 나머지 타입을 근거로 추론하는 것 같다.

- 함수 매개변수 타입으로 사용 불가능

- auto 키워드를 사용하여 선언할 경우에 반드시 초기값이 있어야 한다.

 

사용 예제

#include <iostream>
#include <vector>

class Knight
{

};

// 함수 매개변수 타입으로 쓰인 경우 -> 컴파일 에러.
int Func(auto num1, auto num2) 
{

}

// 함수 리턴 타입으로 auto가 사용 가능.(c++14부터)
auto Func1(int num1, int num2)
{
    return num1 + num2;
}

int main()
{
    // 정상적으로 함수 추론이 가능한 경우.
    {
        auto a = 3; // int
        auto b = 3.14f; // float
        auto c = 1.23; // double
        auto d = Knight(); // class
        auto e = "rookiss"; // string literal
        auto f = Func1(1, 2); // int
    }

    // 컴파일 에러. auto 타입 사용시 반드시 초기값이 필요하다.
    {
        auto a; 
    }

    // const와 &가 포함된 타입은 정확하게 추론하지 못 하는 auto.
    {
        int a;
        int& ref = a;
        const int cst = a;

        auto refAuto = ref; // int 
        auto cstAuto = ref; // int
    }

    // auto 특성을 제대로 이해하고 사용된 예
    {
        std::vector<int> v;
        v.push_back(1);
        v.push_back(2);
        v.push_back(3);

        for (size_t i = 0; i < v.size(); i++)
        {
            //!주의! 이 경우 여전히 int 타입으로 추론합니다. 
            //auto data = static_cast<int&>(v[i]); 

            auto& data = v[i]; // int&
            data = 100;
        }
    }

    // stl literator에 사용된 auto
    {
        std::vector<int> v;
        v.push_back(1);
        v.push_back(2);
        v.push_back(3);

        // auto 사용 이전.
        for (std::vector<int>::iterator it = v.begin(); it < v.end(); it++)
        {
            *it = 1;
        }

        // auto 사용 후.
        for (auto& it : v)
        {
            it = 1;
        }
    }
}

 

결론

- 특별하게 타입이 길지 않는 이상 명시적으로 타입을 지정하는게 가독성 측면에서 좋은 것 같다.

- stl literator 같은 경우 사용 빈도가 높고 타입이 길어지는 경우가 많으니 auto를 사용하기 적합

- 태블릿과 같이 고급기법에서 auto가 활용 되기도 한다.

 


공부한 내용을 개인적으로 복습하기 쉬운 형태로 정리했습니다.

잘못된 내용이 있는 경우 언제든 댓글 혹은 이메일로 지적해주시면 감사드립니다.

 

728x90

'Programming Language > C++' 카테고리의 다른 글

{} 중괄호 초기화  (0) 2022.02.06
using - type alias declaration  (0) 2022.02.06
함수 객체(함수자, Functor)  (0) 2022.02.06
함수 포인터  (0) 2022.02.06
2-2_입력( <<,manipulator,조정자)  (0) 2021.12.07

+ Recent posts