2011-09-28 6 views
90

C++을 배우기 위해 사용했던 모든 자료에서 auto은 항상 목적을 달성하지 못한 이상한 저장 기간 지정자입니다. 그러나 최근에는 유형 이름으로 사용한 코드를 만났습니다. 호기심에서 나는 그것을 시험해 보았고, 내가 그것에 할당 할 일이 무엇이든간에 그것을 가정한다.C++ 자동 키워드입니다. 왜 그것이 마법인가?

갑자기 STL 반복기와 템플릿을 사용하는 모든 것이 쓰는 것이 10 배 쉽습니다. 파이썬처럼 '재미있는'언어를 사용하고있는 것처럼 느껴집니다.

이 키워드는 내 평생 동안 어디 있었습니까? 비주얼 스튜디오에서나 독점적이라고 말하는 것으로 내 꿈을 대쉬 하시겠습니까?

+10

입니다. 마법. 그것은 새롭다 (_oh noes, 나쁜 pun_). 이제 비동기가 미래입니다 (_gasp_) – sehe

+1

다음은 자동 키워드 http : //en.cppreference에 대한 참조입니다.co.kr/w/cpp/language/auto – andyqee

답변

80

auto은 거의 영원히 있었지만 거의 두 가지 조건이 있었기 때문에 실제로 사용되지 않았던 C에서 "상속받은"C++ 키워드입니다. 허용되지 않았거나 기본적으로 가정되었습니다.

추론 형을 의미하는 auto의 사용은 C++ 11 (이전에는 C++ 0x라고 함)에서 새로 추가되었습니다. 최근에 C++ 11 표준이 발표 되었기 때문에 아직 이해할 수없는 일부 컴파일러가있을 수 있습니다.

동시에, auto x은 함수 템플릿에 대한 템플릿 유형 공제와 거의 같은 방식으로 작동합니다. 점 A에서

template<class T> 
int whatever(T t) { 
    // point A 
}; 

은 일종 whatever의 파라미터에 대한 통과 값에 따라 T에 할당 된이 같은 함수 템플릿을 고려한다. auto x = some_expression;을 수행 할 때 본질적으로 동일한 유형 공제 메커니즘을 사용하여 초기화하는 데 사용되는 some_expression 유형에서 x의 유형을 결정합니다.

이것은 컴파일러가 구현해야하는 대부분의 유형 공제 메커니즘이 auto이며 이미 C++ 98/03을 구현하려는 모든 종류의 컴파일러의 템플릿에 사용된다는 것을 의미합니다. 따라서 C++ 11을 아직 지원하지 않는 컴파일러 인 경우에도 auto에 대한 지원을 추가하면 이 될 것입니다.은 쉽고 빠릅니다.

이 답변이 원래 작성되었을 때 (2011 년 잉크가 C++ 11 표준에서 건조하기 전에) auto은 이미 상당히 휴대 가능했습니다. 요즘에는 모든 주류 컴파일러에서 이식성이 뛰어납니다. C 컴파일러와 호환되는 코드를 작성해야하거나 특정 틈새 컴파일러를 대상으로 할 필요가있는 경우 (예 : 일부 사람이 코드를 작성하는 경우 Borland, Watcom 등의 컴파일러를 사용하는 MS-DOS의 경우 수십 년 만에 상당한 업그레이드가 없었습니다.

10

이 기능은 평생 동안 존재하지 않았습니다. 2010 버전 이후로 Visual Studio에서 지원되었습니다. 새로운 C++ 11 기능이기 때문에 Visual Studio 전용이 아니며 휴대용입니다. 대부분의 컴파일러는 이미 그것을 지원합니다.

18

일반적으로 쓸모없는 키워드를 사용하고 새로운 기능을 추가하는 것입니다. C++ 11에서는 표준이며, C++ 11을 지원하는 대부분의 C++ 컴파일러도 지원합니다.

+0

오! 아하, C++을 언어 자체로 변할 수있는 것으로 생각하지 않았습니다. 나는이 C++ 11에서 추가 한 것들을 찾아 봐야 할 것입니다. C++ 0x를 약간 들었지만 너무 깊지는 않았습니다. –

+6

@Clairvoire C++ 0x는 임시 이름입니다. 이번 달에 출판되어 C++ 11이되었습니다. –

3

어디에도 가지 않습니다 ... C++ 11 구현의 새로운 표준 C++ 기능입니다. 즉, 객체 선언을 단순화하고 특정 호출 패러다임 (즉, 범위 기반 루프)의 구문을 정리하는 훌륭한 툴이지만 과도하게 사용하거나 남용하지 마십시오 :-)

5

변수의 경우 선언되는 변수의 유형이 이니셜 라이저에서 자동으로 추론되도록 지정합니다. 함수의 경우 반환 형식이 후행 반환 형식이거나 반환 문에서 추론되도록 지정합니다 (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), 키워드 자동 사용될 수있다 형식 지정자로 사용됩니다. 이니셜 라이저 유형이 결정되면 컴파일러는 함수 호출에서 템플릿 인수 공제 규칙을 사용하여 키워드 auto를 대체 할 유형을 결정합니다. 자세한 내용은 템플릿 인수 공제 # 기타 컨텍스트를 참조하십시오. 키워드 auto에는 유형 공제에 참여하는 수정 자 (예 : const 또는 &)가 수반 될 수 있습니다. 예를 들어 const auto& i = expr;으로 주어진 경우, i의 유형은 f(expr) 함수 호출이 컴파일 된 경우 가상 템플릿 template<class U> void f(const U& u)에있는 인수 u의 유형과 정확하게 일치합니다. 따라서 자동 & &은 범위 기반 루프에 사용되는 이니셜 라이저에 따라 왼쪽 값 참조 또는 오른쪽 값 참조로 추론 할 수 있습니다. auto를 사용하여 여러 변수를 선언하는 경우 연역 유형이 일치해야합니다. 예를 들어, auto i = 0, d = 0.0; 선언은 부적절한 반면, auto i = 0, *p = &i; 선언은 올바른 형식이며 auto는 int로 추론됩니다.

2) 후행 반환 형식 구문을 사용하는 함수 선언에서 키워드 auto는 자동 형식 검색을 수행하지 않습니다. 구문의 일부로 만 사용됩니다.

3) 후행 반환 형식 구문을 사용하지 않는 함수 선언에서 키워드 auto는 반환 값 형식이 템플릿 인수 공제 규칙을 사용하여 return 문의 피연산자에서 추론된다는 것을 나타냅니다.

4) 변수의 선언 된 유형이 decltype (자동) 인 경우 키워드 auto는 해당 이니셜 라이저의 표현식 (또는 표현식 목록)으로 대체되고 실제 유형은 decltype에 대한 규칙을 사용하여 추론됩니다.

5) 함수의 반환 형식이 decltype (auto)으로 선언 된 경우 auto 키워드는 return 문의 피연산자로 대체되고 실제 반환 형식은 decltype에 대한 규칙을 사용하여 추론됩니다.

6) auto :: 형식의 중첩 이름 지정자는 제한 유형 자리 표시 자 공제 규칙에 따라 클래스 또는 열거 유형으로 대체되는 자리 표시 자입니다.

7) 람다 식의 매개 변수 선언. (since C++ 14) 함수 매개 변수 선언. (개념 TS)

참고 auto가 저장 기간 지정자의 의미를가집니다. auto f() -> int, i = 0;에서와 같이 자동 변수와 함수를 하나의 선언에 함께 사용할 수 없습니다.

자세한 내용은 http://en.cppreference.com/w/cpp/language/auto

+1

코드 예제에는 코드 블록을 사용해야합니다. – KABoissonneault

관련 문제