본문 바로가기
Language & Framework & GIT/C++

[C++] auto?

by veganwithbacon 2023. 11. 23.
반응형

급식 때 건담 게임을 한창 할 때, 오토노토다케시? 누군지는 모르겠는데 입에 달고 다녔던 기억이 난다. 뭔진 모르겠다

암튼, 중간 매개체(rqt, shark뭐시기...)를 통해 ROS에서 PUB/SUB을 주고 받는 과정에서 매개체 없이 바로 주고 받는 경우 코드를 짜다보니 auto를 사용하게 되어 정리했다.(에러났는데 애가 말을 안들어서 개념정리하러옴)

 

  auto?

: c++ 11 이전에는 자동 저장소 클래스에 있는 변수, 지역변수를 선언하는 역할

  c++ 11부터는 auto라는 선언의 초기화 식에서 형식이 추론되는 변수를 선언하는 역할

 

c++ 버전에 따라 auto라는 키워드가 동작을 다르게 하니 주의하자!

 #include <iostream>
using namespace std;
int main( )
{
    int count = 10;
    int& countRef = count;
    auto myAuto = countRef;

    countRef = 11;
    cout << count << " ";

    myAuto = 12;
    cout << count << endl;
}

 

1번 케이스는 count 참조변수로 11과 12가 출력

#include <initializer_list>

int main()
{
    // std::initializer_list<int>
    auto A = { 1, 2 };

    // std::initializer_list<int>
    auto B = { 3 };

    // int
    auto C{ 4 };

    // C3535: cannot deduce type for 'auto' from initializer list'
    auto D = { 5, 6.7 };

    // C3518 in a direct-list-initialization context the type for 'auto'
    // can only be deduced from a single initializer expression
    auto E{ 8, 9 };

    return 0;
}

위의 d의 케이스와 같이 추론이 불가하거나 e처럼 여러 변수를 통한 초기화 방법은 오류를 야기한다.

 

 

  함수 매개변수

auto 키워드는 함수의 매개변수로 쓰일 수 없다.

 

 

  구조체나 클래스 등의 멤버변수

struct {
    auto b;
}
class Person{
    auto name;
}

 

auto 키워드는 해당 객체의 자료형 크기를 정할 수 없기 때문에 구조체나 클래스 등의 멤버 변수로 쓰일 수 없다.

그러나 리턴형으로는 사용 가능하다.

 

 

auto A(){     //에러 후행 반환 형식을 지정하지 않음
    return 3.2;
}
auto A()->double{  //정상, 함수 뒤에 후행 반환 형식 이라는 것을 지정해 주어야 한다.
    return 3.2;
}

하지만 이런 식으로 후행 반환 형식을 지정한다는것은 일반적인 double return 형 함수와 똑같다. 그렇기 때문에 auto는 templete와 함께 사용해야 의미가 있다.

 

template<typename T1, typename T2>
auto A(T1 t1, T2 t2)->decltype(t1+t2){
    return t1+t2;
}

위의 A라는 함수에서 int형과 double형이 매개변수로 들어오면 decltype에서 t1, t2를 더해서 double이 되고, auto가 자동적으로 double형태로 리턴이 된다. 즉, decltype을 이용해서 리턴 시킬 자료형을 예측 가능하도록 만들어 줄 수 있다.

 

이러한 방법은 매우 큰 이점을 갖게 된다.

templete를 사용하는 상황에서는 int와 double형의 매개변수 대입 순서를 알 수 없다.

하지만 더 큰 자료형을 return을 시켜주고 싶을 때, decltype을 이용해서 double형을 리턴 시킬 수 있게 만들수 있다. 이때 auto를 이용하여 자료형을 모르는 상황에서도 적절한 자료형인 double을 리턴 할 수 있게된다.

 

auto를 사용하지 않는다면 사용자는 모든 경우의 자료형을 갖는 함수를 만들어야 할 것이다.

 

int A(int t1, int t2);
double A(int t1, double t2);
double A(double t1, int t2);
double A(double t1, double t2);

더욱 다양한 자료형을 사용하는 경우를 고려한다면 templete과 auto를 같이 사용한다면 매우 깔끔하게 하나의 함수 작성만으로 끝나게 된다.

 

이러한 장점이 존재하는 auto가 있어 개발이 쉽고 간편해 지지만 무분별하게 사용하는것은 자료형을 파악하기 어려워 지고 가독성이 낮아지게 된다. 그렇기 때문에 코드 컨벤션 등을 지키면서 적절한 위치에 사용을 한다면 아름다운 코드를 만들 수 있을 것이다.

 

 

참고 :

https://docs.microsoft.com/ko-kr/cpp/cpp/auto-cpp?view=vs-2019
https://m.blog.naver.com/kyed203/220068115571
https://dydtjr1128.github.io/cpp/2019/06/04/Cpp-auto.html
반응형

댓글