A* a = new A() // 실제로는 템플릿화 되있음
이런 객체를
Vector<A> vctA; 여기다가
vctA.push_back(*a) 이게 아니라
vctA.push_back(a) 이렇게도 되더라.
똑같이 [] 연산자로 접근 가능해 A*가 아닌 A 객체로 저장된다..
이상해서 push_back 호출을 보니까
vctA.push_back(a) 인 경우에
push_back(타입 &&obj) 인 함수를 호출하더라구
Rvalue reference랑 관련잇는거 같은데
내가 아는 rvalue reference는 임시값을 lvalue처럼 사용하는거로 알고 있거든?
저 위의 경우가 가능한 이유가 뭘까?
이런 객체를
Vector<A> vctA; 여기다가
vctA.push_back(*a) 이게 아니라
vctA.push_back(a) 이렇게도 되더라.
똑같이 [] 연산자로 접근 가능해 A*가 아닌 A 객체로 저장된다..
이상해서 push_back 호출을 보니까
vctA.push_back(a) 인 경우에
push_back(타입 &&obj) 인 함수를 호출하더라구
Rvalue reference랑 관련잇는거 같은데
내가 아는 rvalue reference는 임시값을 lvalue처럼 사용하는거로 알고 있거든?
저 위의 경우가 가능한 이유가 뭘까?
vector 소스를 보지 않았지만 그냥 템플릿으로 T** 면 T 로 T* 면 T 로 T 면 T 로 바꿔주는 코드 하나 짜서 ( using 이나 struct ) 원래 만들어진 T 랑 매칭시키면 되잖.
아! 그럼 코드세이퍼님 저게 포인터가 객체로 변환되게 템플릿화 되있다는 말씀인가요?
push_back(&&) 자체는 그냥 rvalue 레퍼런스가 아니라 퍼펙트 포워딩이라고 하는건데 저건 흐으으음 - return 0;
push_back 안에 std::move 가 rvalue reference 를 이용한 구현되어 있을테고 std:move 안에 remove_reference 가 구현되어 있을꺼란 말이지 뭐
http://en.cppreference.com/w/cpp/types/remove_reference
봐봐
대충 이런식이지?
아 push_back에도 리무브 레퍼런스가 달려 있는지는 몰랐네요 - return 0;
이따 점심시간에 한번 읽어봐야겠네요! 감사합니다!!
코드세이퍼님 remove_reference는 &와 &&이던데 포인터(*)도 제거해주는것도 remove_pointer 같은게 따로 있는건가요?
글쓴이입니다! (=223.62)
ㅋㅋ * 를 넘겼더니 push_back 은 왜 불렸는지 생각해보셈.
아 잘못 말했네요 포인터 변수를 넘기면 템플릿에서 *을 붙여주는건가요? (글쓴이입니다.) 시플플못알이라 ㅠㅠ
아 이해했다!! 감사합니다!!