[모던C++입문] 3.4 타입 추론과 정의

    3.4 타입 추론과 정의

    auto 변수 타입

    • auto타입은 모든 표현식에 적용되는 자동타입이 아닌 한번 정해진 뒤에는 변하지 않는 타입
    auto i = 2 * 7.5, j = std::sqrt(3.7);   //정상: double
    auto i - 2 * 4, j = std::sqrt(3.7);     //오류: i=int j=double
    auto i = 2 * 4, j;                      //오류: j가 초기화되지 않음
    auto v = g(x, y, z);                    //g의 결과 타입
    
    auto& ri = i;                   //i에 대한 레퍼런스
    const auto& cri = i;            //i에 대한 const 레퍼런스
    auto&& ur = g(x, y, z);         //g결과에 대한 포워드 레퍼런스

    표현식의 타입 (C++11)

    • decltype은 표현식의 타입을 반환하는 함수
    • 리턴 타입 추적(Trailing Retrun Type) 기능으로도 사용할수 있다
    int a = 10;
    decltype(a) b = 2;  //int
    
    template<typename V1, typename V2)
    auto operator+(const V1& rv, const V2 lv) -> vector<decltype(rv[0] + lv[0])>
    {
        return rv + lv;
    }

    decltype(auto) (C++11)

    int i = 1;
    
    int& GetRefInt()
    {
        return i;
    }
    
    int main(int argc, const char * argv[])
    {
        auto autoVar = GetRefInt();             //autoVar은 int 타입
        decltype(auto) declVar = GetRefInt();   //declVar은 int& 타입
    }

    타입 정의하기 (C++11)

    • typedef는 앞의 타입을 뒤에 이름으로 축소하여 사용 (기존 C++)
    • using은 뒤의 타입을 앞의 이름으로 사용 (C++11)
    • using을 사용하자
    typedef double value_type;
    using value_type = double;
    
    //배열이나 함수 선언시 배열의 []나 함수의 인자가 앞이 아닌 마지막에 붙어야한다
    typedef double da1[10];
    using da2 = double[10];
    
    typedef float float_fun1(float, int);
    using float float_fun2 = float(float, int);
    • using으로 템플릿 에일리어스(Template Alias)를 정의할 수 있다.
    template <typename T>
    using Tvec = vector<T, xallocator<T>>;
    
    Tvec<int> Tlist { 1, 2, 3 };
    반응형

    댓글

    Designed by JB FACTORY