Prog&Algol
C++ | auto & decltype for type deduction
GilbertPark
2022. 3. 20. 21:32
변수를 초기화할 때, 명시적 타입을 적는 대신 auto 타입 지정자를 넣을 수 있다. auto는 그것의 초기자로부터 개체의 타입을 추론하게 되는데, 타입은 변수, const나 constexpr일 수 있다. 하지만 구문의 타입은 레퍼런스가 될 수 없다. 왜냐하면 레퍼런스는 암시적으로 구문에서 참조되지 않기 때문이다.
다시 말해, auto는 초기자의 타입을 위한 플레이스홀더(placeholder)가 된다.
#include <iostream>
#include <typeinfo>
using namespace std;
int main() {
auto sum = 1 + 3;
cout << sum << endl;
cout << typeid(sum).name() << endl;
return 0;
}
- c++ 11에서 타입 추론.
- auto 키워드는 선언된 변수의 초기화 식을 사용하여 해당 형식을 추론하도록 컴파일러에 지시한다.
- auto 키워드를 사용하면 초깃값의 형식에 맞춰 선언하는 인스턴스(변수)의 형식이 자동으로 결정된다. 이것을 타입추론(type inference)라고 한다.
- 단 auto 사용에는 주의해야할 점이 있는데 생성 시 변수를 초기화 할때만 작동한다. 초기화 값을 사용하지 않고 생성된 변수는 이 기능을 사용할 수 없다.
- 또한 auto 키워드는 함수 매개 변수와 함께 사용할 수 없다.
range-based for statement
#include <iostream>
using namespace std;
int main()
{
int fibonacci[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 };
for (int number : fibonacci) cout << number << ' ';
return 0;
}
element_declaration은 배열 요소와 같은 자료형을 가져야 하므로, auto keyword를 사용해서 C++가 자료형을 추론하도록 하는것도 좋은 방법이다.
#include <iostream>
using namespace std;
int main() {
int arr[5];
for (int i = 0; i < 5; i++) arr[i] = i;
for (auto num : arr) cout << num << ' ';
return 0;
}
위의 경우 각 배열의 요소가 num으로 복사가 된다.
#include <iostream>
using namespace std;
int main() {
int arr[5];
for (int i = 0; i < 5; i++) arr[i] = i;
for (auto &num : arr) cout << num << ' '; //using reference
return 0;
}
위의 경우 num은 현재 반복된 배열 요소에 대한 참조이므로 값이 복사되지 않지만, num을 수정하면 배열의 요소에 영향을 준다. 이런 경우 읽기 전용인 const로 num을 만들어 볼 수 있다.
#include <iostream>
using namespace std;
int main() {
int arr[5];
for (int i = 0; i < 5; i++) arr[i] = i;
for (const auto &num : arr) cout << num << ' ';
return 0;
}
반응형