C ++ 자동 키워드. 왜 마법인가?
C ++을 배우기 위해 사용한 모든 자료에서 auto
항상 어떤 목적에도 도움이되지 않는 이상한 저장 기간 지정자였습니다. 그러나 최근에는 코드를 유형 이름으로 사용하는 코드가 발생했습니다. 호기심으로 나는 그것을 시도했고, 그것에 할당 된 일의 유형을 가정합니다!
갑자기 STL 이터레이터와 템플릿을 사용하는 모든 것은 10 배나 쓰기 쉽다. 파이썬과 같은 '재미있는'언어를 사용하고있는 것 같습니다.
이 키워드는 어디에 있었습니까? 비주얼 스튜디오 전용이거나 휴대용이 아니라고 내 꿈을 꾸려 나가겠습니까?
auto
C ++가 C에서 "상속"한 키워드로 거의 영원히 존재했지만 실제로는 허용되지 않았거나 기본적으로 가정 된 두 가지 조건 만 있기 때문에 거의 사용되지 않았습니다.
의 사용 auto
추정되는 유형을 의미하기는 C ++ 11의 새로운이었다.
동시에, auto x = initializer
유형 추론 x
의 유형과 initializer
기능 템플릿 템플릿 유형 공제 작품과 같은 방식으로. 다음과 같은 함수 템플릿을 고려하십시오.
template<class T>
int whatever(T t) {
// point A
};
지점 A T
에서 매개 변수에 전달 된 값 을 기반으로 유형이 지정되었습니다 whatever
. 그렇게 auto x = initializer;
하면 동일한 유형의 추론을 사용하여 유형 을 초기화하는 데 사용되는 x
유형 을 결정 initializer
합니다.
이것은 컴파일러가 구현해야하는 대부분의 타입 추론 메커니즘 auto
이 이미 존재하며 C ++ 98 / 03을 구현하려고 시도한 컴파일러의 템플릿에도 이미 사용되었다는 것을 의미합니다. 따라서 지원을 추가하는 auto
것은 본질적으로 모든 컴파일러 팀에게 상당히 쉬웠습니다. 상당히 빠르게 추가되었으며 관련 버그가 거의없는 것 같습니다.
이 답변이 처음 쓰여졌을 때 (2011 년, 잉크가 C ++ 11 표준에서 건조되기 전에) auto
이미 이식성이있었습니다. 요즘에는 모든 주류 컴파일러 사이에서 완전히 이식 가능합니다. 피해야 할 유일한 이유는 C 컴파일러와 호환되는 코드를 작성해야하거나 지원하지 않는 틈새 컴파일러를 대상으로해야하는 경우입니다 (예 : 소수의 사람들이 여전히 코드 작성) 수십 년 동안 크게 업그레이드되지 않은 Borland, Watcom 등의 컴파일러를 사용하는 MS-DOS의 경우) 주류 컴파일러 중 합리적으로 최신 버전을 사용하는 경우이를 피할 이유가 없습니다.
일반적으로 쓸모없는 키워드를 가져 와서 새롭고 더 나은 기능을 제공합니다. C ++ 11의 표준이며 일부 C ++ 11 지원 기능이있는 대부분의 C ++ 컴파일러가이를 지원합니다.
이 기능은 평생 존재하지 않았습니다. 2010 버전부터 Visual Studio에서 지원되었습니다. 새로운 C ++ 11 기능이므로 Visual Studio 전용이 아니며 이식 가능합니다. 대부분의 컴파일러는 이미이를 지원합니다.
변수의 경우 선언되는 변수의 유형이 초기화 프로그램에서 자동으로 추론되도록 지정합니다. 함수의 경우 리턴 유형이 후행 리턴 유형이거나 리턴 문에서 추론되도록 지정합니다 (C ++ 14 이후).
통사론
auto variable initializer (1) (since C++11)
auto function -> return type (2) (since C++11)
auto function (3) (since C++14)
decltype(auto) variable initializer (4) (since C++14)
decltype(auto) function (5) (since C++14)
auto :: (6) (concepts TS)
cv(optional) auto ref(optional) parameter (7) (since C++14)
설명
1) 블록 범위, 네임 스페이스 범위, for 루프의 초기화 명령문 등에서 변수를 선언 할 때 키워드 auto를 유형 지정자로 사용할 수 있습니다. 이니셜 라이저의 유형이 결정되면 컴파일러는 함수 호출에서 템플릿 인수 공제 규칙을 사용하여 키워드 auto를 대체 할 유형을 결정합니다 (자세한 내용은 템플릿 인수 deduction # Other contexts 참조). 키워드 auto에는 유형 공제에 참여할 const 또는 &와 같은 수정자가 수반 될 수 있습니다. 예를 들어, 주어진 const auto& i = expr;
i의 유형은 template<class U> void f(const U& u)
함수가 호출되면 가상의 템플릿에서 인수 u의 유형과 정확히 일치합니다.f(expr)
컴파일되었습니다. 따라서 auto &&는 범위 기반 for 루프에서 사용되는 이니셜 라이저에 따라 lvalue 참조 또는 rvalue 참조로 추론 될 수 있습니다. auto를 사용하여 여러 변수를 선언하는 경우 추론 된 유형이 일치해야합니다. 예를 들어 선언 auto i = 0, d = 0.0;
은 형식이 잘못된 반면 선언의 형식 auto i = 0, *p = &i;
은 양호하고 자동은 int로 추론됩니다.
2) 후행 리턴 유형 구문을 사용하는 함수 선언에서 키워드 auto는 자동 유형 감지를 수행하지 않습니다. 구문의 일부로 만 사용됩니다.
3) 후행 리턴 유형 구문을 사용하지 않는 함수 선언에서 키워드 auto는 템플리트 인수 공제 규칙을 사용하여 리턴 명령문의 피연산자에서 리턴 유형이 추론됨을 나타냅니다.
4) If the declared type of the variable is decltype(auto), the keyword auto is replaced with the expression (or expression list) of its initializer, and the actual type is deduced using the rules for decltype.
5) If the return type of the function is declared decltype(auto), the keyword auto is replaced with the operand of its return statement, and the actual return type is deduced using the rules for decltype.
6) A nested-name-specifier of the form auto:: is a placeholder that is replaced by a class or enumeration type following the rules for constrained type placeholder deduction.
7) A parameter declaration in a lambda expression. (since C++14) A function parameter declaration. (concepts TS)
Notes Until C++11, auto had the semantic of a storage duration specifier. Mixing auto variables and functions in one declaration, as in auto f() -> int, i = 0;
is not allowed.
For more info : http://en.cppreference.com/w/cpp/language/auto
It's not going anywhere ... it's a new standard C++ feature in the implementation of C++11. That being said, while it's a wonderful tool for simplifying object declarations as well as cleaning up the syntax for certain call-paradigms (i.e., range-based for-loops), don't over-use/abuse it :-)
참고URL : https://stackoverflow.com/questions/7576953/c-auto-keyword-why-is-it-magic
'programing tip' 카테고리의 다른 글
jQuery를 사용하여 event.preventDefault ()를 호출하는 리스너를 바인딩 해제하는 방법은 무엇입니까? (0) | 2020.07.05 |
---|---|
CMAKE가 오류를 발생시키는 원인 (0) | 2020.07.05 |
동일한 인터페이스를 구현하는 두 개의 bean을 자동 배선-기본 bean을 autowire로 설정하는 방법은 무엇입니까? (0) | 2020.07.05 |
배치 파일에서 if-else 구조를 사용하는 방법은 무엇입니까? (0) | 2020.07.05 |
로컬 Git 브랜치를 원격 저장소에 복사하는 방법 (0) | 2020.07.05 |