결과:
[2022-06-14 05:17:36.058] [info] hello world
[2022-06-14 05:17:36.059] [info] Constructor 1
[2022-06-14 05:17:36.059] [info] Constructor 2
[2022-06-14 05:17:36.060] [info] Destructor 2
[2022-06-14 05:17:36.060] [info] After Get
[2022-06-14 05:17:36.060] [info] Destructor 1
--------------
Test는 생성자, 소멸자 로그 찍으려고 만든 간단한 래퍼 클래스임다
일단 u2 포인터는 getUnique함수가 끝나서 유니크 포인터 내부적으로 소멸자에서 delete를 호출하는거는 알고있는데여
여기서 u가 소멸자가 호출되지 않는 이유가 정확히 어떻게 되나요??
원래 유니크 포인터는 최초 정의된 영역 밖으로 나가면 소멸자 호출돼서 delete 되는거 아닌가요??
함수 밖으로 리턴돼서 k에 대입되는 이유가 궁금합니다 ㅠ
move constructor도 아니고 copy constructor도 아니고 copy assignment operator도 아니고 move assignment operator도 아니고 그냥 생성자가 호출되는 이유가 뭔가요 ㅜㅜ
그리고 생각해보면 유니크 포인터는 애초에 l-value 대입 연산이 지워져 있는데, getUnique 함수의 리턴인 유니크 포인터가 대입되는 형태가 문제 없이 컴파일 되고 실행되는것도 이상하네요 ㅜ 심지어 6번 라인을 std::move(u) 해서 리턴해도 기존과 똑같은 결과가 나옵니다 흑흑
rvo?
rvo
1. unique_ptr 대입은 들고 있는 pointer만 전달하니 unique_ptr 자체의 생성/소멸 여부는 저렇게는 알 수 없음 2. 저렇게 변수를 리턴하면 컴파일러가 NRVO(named return value optimization)를 적용해서 u를 k 자리에 바로 생성할 수 있음(RVO와 다르게 NRVO는 적용하지 않아도 표준 위반은 아님)
nrvo 문제 및 유니크 포인터인거랑 별개로 애초에 = 썼다고 대입이 아님 변수 생성과 동시에 초기화되는 상황에서는 생성자가 호출됨
아 모던 이펙티브 C++까지는 필수로 읽어야된다고 ㅋㅋㅋ