C ++ 자동 키워드. 왜 마법인가?


145

C ++을 배우기 위해 사용한 모든 자료에서 auto항상 어떤 목적에도 도움이되지 않는 이상한 저장 기간 지정자였습니다. 그러나 최근에는 코드를 유형 이름으로 사용하는 코드가 발생했습니다. 호기심으로 나는 그것을 시도했고, 그것에 할당 된 일의 유형을 가정합니다!

갑자기 STL 이터레이터와 템플릿을 사용하는 것은 10 배나 작성하기 쉽습니다. 파이썬과 같은 '재미있는'언어를 사용하고있는 것 같습니다.

이 키워드는 어디에 있었습니까? 비주얼 스튜디오 전용이거나 휴대용이 아니라고 내 꿈을 꾸려 나가겠습니까?


18
그렇지 않습니다. 마법. 그것은 새로운 것입니다 ( 오, 아니, 나쁜 말장난 ). 이제 비동기 미래입니다 ( 헐떡 거림 )
sehe

2
다음은 자동 키워드에 대한 참조입니다. en.cppreference.com/w/cpp/language/auto
andyqee

답변:


149

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의 경우) 주류 컴파일러 중 합리적으로 최신 버전을 사용하는 경우이를 피할 이유가 없습니다.


24

일반적으로 쓸모없는 키워드를 가져 와서 새롭고 더 나은 기능을 제공합니다. C ++ 11의 표준이며 일부 C ++ 11 지원 기능이있는 대부분의 C ++ 컴파일러가이를 지원합니다.


오! Aha, C ++ 언어는 그 자체로 변할 수있는 것으로 생각하지 않았습니다. 나는이 C ++ 11에 추가 한 것을 찾아야 할 것입니다 .C ++ 0x가 조금 들었지만 너무 깊이 파고 들지 않았습니다.
앤 퀸

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

13

변수의 경우 선언되는 변수의 유형이 초기화 프로그램에서 자동으로 추론되도록 지정합니다. 함수의 경우 리턴 유형이 후행 리턴 유형이거나 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) 변수의 선언 된 유형이 decltype (auto) 인 경우 키워드 auto는 이니셜 라이저의 표현식 (또는 표현식 목록)으로 대체되고 실제 유형은 decltype에 대한 규칙을 사용하여 추론됩니다.

5) 함수의 리턴 유형이 decltype (auto)로 선언되면 키워드 auto는 return 문의 피연산자로 대체되고 실제 리턴 유형은 decltype의 규칙을 사용하여 추론됩니다.

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

7) 람다 식의 파라미터 선언. (C ++ 14부터) 함수 매개 변수 선언. (개념 TS)

참고 C ++ 11까지 자동 저장 기간 지정의 의미를 가지고 있었다. 자동 변수와 함수를 하나의 선언으로 혼합하는 auto f() -> int, i = 0;것은 허용되지 않습니다.

자세한 정보 : http://en.cppreference.com/w/cpp/language/auto


11

이 기능은 평생 존재하지 않았습니다. 2010 버전부터 Visual Studio에서 지원되었습니다. 새로운 C ++ 11 기능이므로 Visual Studio 전용이 아니며 이식 가능합니다. 대부분의 컴파일러는 이미이를 지원합니다.


3

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


3

auto 키워드는 선언되는 변수 유형이 초기화 프로그램에서 자동으로 제외되도록 지정합니다. 함수의 경우 반환 유형이 자동 인 경우 런타임에 반환 유형 표현식으로 평가됩니다.

반복자를 사용해야 할 때 매우 유용 할 수 있습니다. 예를 들어 아래 코드의 경우 전체 반복자 구문을 작성하는 대신 "auto"를 사용할 수 있습니다.

int main() 
{ 

// Initialize set 
set<int> s; 

s.insert(1); 
s.insert(4); 
s.insert(2); 
s.insert(5); 
s.insert(3); 

// iterator pointing to 
// position where 2 is 
auto pos = s.find(3); 

// prints the set elements 
cout << "The set elements after 3 are: "; 
for (auto it = pos; it != s.end(); it++) 
    cout << *it << " "; 

return 0; 
}

이것이 "auto"키워드를 사용하는 방법입니다


0

매직은 특정 함수에 전달 된 모든 변수 유형에 대한 코드 작성을 줄일 수있는 기능입니다. C 기반의 파이썬과 유사한 print () 함수를 고려하십시오.

#include <iostream>
#include <string>
#include <array>

using namespace std;

void print(auto arg) {
     cout<<arg<<" ";
}

int main()
{
  string f = "String";//tok assigned
  int x = 998;
  double a = 4.785;
  string b = "C++ Auto !";
//In an opt-code ASCII token stream would be iterated from tok's as:
  print(a);
  print(b);
  print(x);
  print(f);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.