C++에서 함수에 파라미터를 넘길 경우....아래 두가지는 값에 의한 전달
1. 함수 객체
2. 기본 데이터 타입
그외 나머지는 const type& 형태로 넘기는데......이때..
1. 넘길려는 타입이 type 이면 생성과 소멸의 비용을 없앰( 함수에서 임시 객체가 생성 안됨 )
2. type이 아니지만 type으로 변환이 가능하다면 .. 이경우에는 임시 객체가 생기고 해당 임시객체가 const type&에 의해서 가르킨다
여기까지는 이해가 됬엉.. 근데 r-reference 를 왜 쓰는지 이해가 도통 안되는거야...
그래서 역 어셈블리로 보니까.. 조금은 추측되는게...
일딴 const type& 과 type&& 의 어셈 코드는 동일해,, 완전 동일했엉
근데 무엇이 차이를 만들까? 생각해 봤는데.. 그 부분은 바로 "수정을 허용 한다" (= type&& ) "수정을 허용하지 않는다"( = const type& ) 인거 같아..
그럼.. const type& 를 const_cast< type& >( object ) 로 케스팅 하면.. 동일한 결과를 얻을수 있을꺼 같은데.. 말야..
내가 이해 하고 있는거...맞앙??
이해몬한거임. const type& val 로 선언되어있는 곳에 rvalue가 들어가면 저 val이란 변수에 rvalue가 카피됨. 반대로 type&&이면 카피안되고 들어간 rvalue자체가 레퍼런스 됨
ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
왜울어? 잘하고 있는디
ㄴ ㄳㄳ 용기를 줘서 감사
rvalue 에서 이리 막히면 xvalue 에선 어떠카시려고 ... ^^
prvalue 는 어떠카고 .. ^^
고딩넘인성보소 ㅜㅜ
ㄴ 뭐~ 시작이 반 아니겠음 ??ㅋㅋ
ㄴ ? 그건 뭐에요?
xvalue? prvalue?
어떤 내용을 모를 수도 있는거지 어떤걸 모른다고 나쁜 프로그래머가 되는건 아닌 것 같다. 먼가 몰라도 환상적으로 짜는 사람이 있음. 그러니까 기죽지 말길 안다고 우쭐할 것도 없고
네 맞습니다 그냥 ㅉㅏ는게 중요함니다 ^^
ㅋㅋㅋ // 그런 환상적인 사람은 어디가야 만납니까 ?ㅠㅠ
type이 제네릭이면 &&로 제네릭따도 걍 레퍼런스 따질때가 있음
대입되는게 임시값이고 아니고의 차이에서 &일지 &&일지가 정해짐 std::move랑 가치써보면 금방 보여요
내가 이해 한게 맞는거 같은뎅...?ㅠㅠ
ㅋㅋㅋ // const type& val 로 선언되어있는 곳에 rvalue가 들어가면 저 val이란 변수에 rvalue가 카피됨 ( 이 내용이 임시 객체가 생성된다는 말이야 ? Yes or NO )
const int& r = 1 + 2 ; 하고 int&& rr = 1 + 2; 하고 임시 객체가 생기는건 마찬가지인데 ??
ㅋㅋㅋ// 반대로 type&&이면 카피안되고 들어간 rvalue자체가 레퍼런스 됨 ( 이 말 자체도 임시객체가 생성되고, 생성된 임시객체를 tpye&& 이 가르킨다 인거 같은데.. 내말이 맞앙? yes or no )
그럼 사실상. const type& 과 type&&의 생성과 소멸은 같은 횟수로 발생되는것인데...
단지 const type&의 경우에는 const type&이 가리키는 객체는 수정이 불가한 상태이고, type&&의 경우에는 가르키는 객체를 수정 가능한 상태이지 move 와 같은 연산이 가능한거고..?
맞음 ??
누가좀 제 생각즘 깨부셔 주셈
다맞음
ㄴ ㅋㅋ 나를믿을수 없엉~
예시를 왜 인티저로 해갖고.. 머가 헷갈린다는거임
변수초기화 말고 파라미터로 받는거 생각해보셈 move로 강제로 우측값 만들어서 넣어도 보고 그냥 레퍼런스로도 넣어보고 호출후에 무슨 차이가 발생해있는지..
ㄴ ㅇㅇ 알겠음 감솨 ㅎㅎ
암시형변환이 왜 &는 안되고 const&는 되고랑 똑같은 문제임
평범한 객체는 move하고 우측값으로 넘겨주면 바인딩 된 멤버변수들이 좌측에 대입되는 값으로 빨려들어감.. 여기서 상수성이 무슨일을 하는지 곰곰히 생각해보셈
ㄴ 너 설명 들으니까 더 헷갈린다 ㅋㅋ
ㄴ 뭐가 빨길래 빨려들어간다는겨?ㅋㅋㅋ
아까 말한거 다맞는게 아니라&는 임시객체를 대입하면 그걸 복사한거의 레퍼런스를 따고 임시객체는 소멸 &&는 임시객체 자체를 받아서 우측값 복사를 함 결과적으로 임시값은 소멸은 되긴하는데 니가 오버로딩하기에 따라 비용이 달라짐
ㄴ 조금더 자세하게 설명즘 해줄래 ?
동적할당된 배열을 멤버로 갖는 클래스가 있고 이거에 대한 일반적인 복사는 깊은복사라 치면
이 클래스의 인스턴스가 임시객체고 니가 &&로 이 임시객체를 우측값으로 받으면 배열의 포인터를 얕은복사하고 아까 임시객체의 포인터는 nullptr로 바꾼다음 알아서 소멸 이런느낌
ㄴ 그러니까 이게 type&&이거 일때만 가능하다는 거잔앙 ? const type&&으로 가르키는 객체는 안되고 ㅇㅋ ?
ㄴ 그래서 move 같은게 가능하고,,,그래서 내가 질문 마지막에 상수성을 없애는 캐스팅으로도 똑같이 구현 가능 하지 않을까라고 말한거구 ~
님이 말하는 type이 콘크리트 타입인지제네릭인지 모르겠음
아.. 콘크리트임 ㅋㅋ
근데 이게 템플릿이랑 짬뽕되면... 상황이 달라짐 ? 이건 나중에 공부하겠음 ㅋㅋ
제네릭에선 type&&랑 상수성이랑 논리적으로 모순으면 걍 &로 받음
ㄴ 나보다 몇수는 앞어 있는데.. 그부분은 나중에 공부 하도록 할께.. 고맙다 ㅎㅎ 나이도 젊은데 기특하네 乃
30일후 전역인데.. 설마 뭐~ 대위 뭐 이런거 아니고. 병장 전역일꺼자녀 ? 맞지? 어린분 ??
네 공군병장이라서 오늘 700일 찍었네요