[C++11] 균일초기화의 모호성.
새 블로그에 첫 글이네요.
이제부터 공부하면서 배워간 지식들을 조금씩 올려보려 합니다.
C++11 부터는 auto라는 키워드가 생기면서
파이썬같이 컴파일러가 자료형을 추론할수가 있습니다.
(예 : auto num1=10; <- 이건 int 변수로 판단합니다)
그리고 또 C++11에 무엇이 더 바뀌었나 하고 찾아봤더니
균일초기화라는게 생겼습니다.
이게 무엇인고 하니 일반변수, 객체변수(클래스 변수)들도
배열처럼 초기화가 가능하다는것입니다.
(예 : int num[]{1,2,3,4,5},
age,name의 속성을 가지는 Identify라는 클래스가 있을때, Identify id{17,"김호종"};
이런식으로 초기화가 가능합니다)
그리고 auto를 이용한 for 루프를 만들어봤습니다.
1 2 3 4 5 6 | auto names{ "석삼","너구리" }; for (auto i : names) { cout << i << endl; } | cs |
근데 안돼는거에요
이래서 내가 또 뭘 틀려먹었구나 하고 주먹구구식으로 고쳐봤습니다.
1 2 3 4 5 6 | auto names={ "석삼","너구리" }; for (auto i : names) { cout << i << endl; } | cs |
잘 돌아가더라구요?
그래서 내가 또 대충공부했구나 싶어서 자세히 찾아보았습니다.
아래와 같은 블로그를 발견했습니다.
http://egloos.zum.com/himskim/v/4049007
여기서 보니 컴파일러들이 추론을하는데, 리스트의 개념일때는 개념들이 모호해진다고 하네요.
대충 요약하면
int num1{10}; -> 이건 명확하게 10의 값을 가진 num1이라는 정수형 변수입니다.
auto num2{123}; -> 이건 단순히볼때는 123을 가진 num2라는 정수형 변수일수도 있지만, 또 다른 입장에서는 1개의 값만을 가진 정수배열일수도 있습니다.
auto num3 = {123}; -> 이부분부터가 중요합니다. 자세히 찾아보니 변수명 = {타입} 이런식으로 입력을 할시에는 무조건 list로 추론을 한다고 합니다. 그러기에 123을 가진 정수 배열이 됩니다.(정확히는 initializer_list<int>라는 STL로 생성됩니다)
auto num4{1,2,3}; -> 이건 위처럼 정수배열로 추론되는게 맞습니다.
auto num5 = {1,2,3}; -> 이것도 정수배열로 추론되는게 맞습니다.
하지만 4번째만을 놓고봤을때는 정수배열이 생기는게 맞지만, 2번째의 경우도 고려를 하면 모호해집니다..(코드를 쓰는사람이야 본인의 생각에 따라 만들겠지만, 컴파일러는 도통 단일변수인지 배열인지 알아먹을수가 없으니 말입니다)
그래서 위의 블로그의 내용을 읽어보니 MS의 개발자들이 새로운 표준을 제안하였다고 합니다.
단수의 변수를 선언할때는 auto var{1010}; 이런식으로 선언을 하고
배열일때는 무조건 auto var={1010,1011}; 이런식으로 선언을 하도록 말입니다.(즉, = 연산자의 차이입니다.)
2012년에 작성하신 글이다 보니, 저 블로그에는 받아들여질것같다고만 되었고, 실제로 테스트를 해보니 받아들여졌습니다.
그래서 위에서 보인 4번과 같은부분은 VS2017기준으로 컴파일러가 이거 안됀다고 욕을 뱉어냅니다..
시간나실때 한번씩 간단하게 확인해보세요 ㅎ