수색…


소개

이 항목에서는 C ++ 11에서 사용할 수있는 키워드 auto 형식과 관련된 유형 유추에 대해 설명합니다.

비고

일반적으로 복사 나 돌연변이와 같은 원치 않는 동작을 방지해야하는 경우 auto 를 사용할 때마다 const , &constexpr 을 선언하는 것이 좋습니다. 이러한 추가 힌트는 컴파일러가 다른 형태의 추론을 생성하지 않도록합니다. 또한 auto 사용을 권장하지 않으며 실제 선언이 매우 길 때, 특히 STL 템플릿을 사용할 때만 사용해야합니다.

데이터 유형 : 자동

이 예제는 컴파일러가 수행 할 수있는 기본 유형 추론을 보여줍니다.

auto a = 1;        //    a = int
auto b = 2u;       //    b = unsigned int
auto c = &a;       //    c = int*
const auto  d = c; //    d = const int*
const auto& e = b; //    e = const unsigned int& 

auto x = a + b     //    x = int, #compiler warning unsigned and signed

auto v = std::vector<int>;    //    v = std::vector<int>

그러나 auto 키워드는 & 또는 const 또는 constexpr 대한 추가 힌트없이 예상 유형 유추를 항상 수행하는 것은 아닙니다.

//    y = unsigned int, 
//    note that y does not infer as const unsigned int&
//    The compiler would have generated a copy instead of a reference value to e or b
auto y = e;    

람다 오토

데이터 유형 auto 키워드는 프로그래머가 람다 함수를 선언 할 수있는 편리한 방법입니다. 프로그래머가 함수 포인터를 선언하기 위해 입력해야하는 텍스트의 양을 줄임으로써 도움이됩니다.

auto DoThis = [](int a, int b) { return a + b; };
//    Do this is of type (int)(*DoThis)(int, int)
//    else we would have to write this long
int(*pDoThis)(int, int)= [](int a, int b) { return a + b; };

auto c = Dothis(1, 2);    //    c = int
auto d = pDothis(1, 2);   //    d = int

//    using 'auto' shortens the definition for lambda functions

기본적으로 람다 함수의 반환 형식이 정의되지 않은 경우 반환 식 형식에서 자동으로 유추됩니다.

이 3 개는 기본적으로 같은 것입니다.

[](int a, int b) -> int  { return a + b; };
[](int a, int b) -> auto { return a + b; };
[](int a, int b) { return a + b; };

루프 및 자동

이 예제에서는 for 루프에 대한 유형 선언을 단축하는 데 auto를 사용하는 방법을 보여줍니다.

std::map<int, std::string> Map;
for (auto pair : Map)            //    pair = std::pair<int, std::string>
for (const auto pair : Map)      //    pair = const std::pair<int, std::string>    
for (const auto& pair : Map)     //    pair = const std::pair<int, std::string>&
for (auto i = 0; i < 1000; ++i)        //    i = int
for (auto i = 0; i < Map.size(); ++i)  //    Note that i = int and not size_t
for (auto i = Map.size(); i > 0; --i)  //    i = size_t


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow