스레드 세이프 스택 설명하는 책에서 나온 예제인데 왜 그냥 데이터 그대로 리턴 안하고 shared_ptr로 리턴해야 좋은 거지?
책에 써있는 거와 검색해본바로는 리턴시 카피할 때 타입에 따라 익셉션이 발생할 수 있어서고 그러면 스택이 변경된 상태로 데이터만 유실되는 반면
shared_ptr은 복사될 때 noexcept이기 때문에 이거에서 안전해서라는데
다른 책에서 T 지역변수가 있고 함수 리턴 타입도 T면 처음부터 리턴할 곳에 데이터가 생성되기 때문에 리턴할 때 카피 안한다고 배웠거든?
그러면 위의 이유는 성립 안하잖아?
반환값 copy elision이 보장된게 C++17 들어와서이긴 한데... 여하튼 보장되는 상황이라면 exception safety 측면에서는 다를게 없을 것 같음
아 잠깐만 C++17에서 보장된건 리턴되고 나서 그 값을 다른 변수에 넣을 때 얘기고, 위같은 내용(NRVO)는 보장이 아직 안되지 않았나...?
버전별로 보장 안보장 컴파일러 맘대로 하 ㅅㅂ
그 복사를 안 한다는건 진짜 복사를 안 한다는게 아니라 복사 연산이 최적화된다는임. 복사 semantic 은 그대로 보장되기 때문에 그 exception 얘기는 맞음 - return 0;
copy elision 일어나면 복사 관련 멤버 함수들이 실행 자체가 안되는데 그것들의 except 여부가 상관이 있나?
아 저 pop 함수의 exception은 변해야겠네