수색…
소개
이 항목에서는 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