concurrency in action 읽기 시작했는데 스레드 안전 스택 만들기 예제의 pop 구현에서 설명에 의문이 드는 사항이 있어서 질문함
pop 메소드 구현 중 pop한 결과물을 리턴하는 인터페이스로 결정했을 경우
밸류 리턴이 아닌 포인터 리턴을 해야한다는데
그 이유가 리턴할 때 포인터 복사는 예외가 일어나지 않기 때문이라고 하더라구
T 자체를 복사할 경우는 T가 noexcept 복사인지 장담할 수가 없으니
그런데 최신 표준에서는 RVO가 보장되잖아?
그러면 data.pop()하기 전 top()한 값 얻어낼 때 shared_ptr 말고 그냥 value로
T const res = data.top()하면 바로 리턴할 스택 위치에 T 타입 데이터가 생성되니
리턴할 때 예외가 일어날 걱정할 필요가 없는거 아님?
물론 생성 과정 자체에서 에러가 일어날 수 있지만
애초에 그러니까 data.pop()하기 전에 하는거고, 그거는 shared_ptr로 만들어놓는 경우도 동일하고
오히려 shared_ptr 쓰면 동적할당이라는 추가적인 예외 생성 포인트가 있는거 아님?
맞음 저거 RVO는 무시한 스니펫임 RVO가 17에서야 보장되는데 그걸 기반한 예제를 만들수는 없지
근데 RVO 쓴다쳐도 리턴된 값을 다시 어느 변수에 저장한다든지 다른 함수의 파라미터로 쓴다든지 해야하지 않냐 최종적으로는 복사나 이동이 일어나긴 하지 그때까지는 예외 안 일어나야하게 하고 T가 noexcept 복사/이동 생성/할당을 갖추고 있다는 보장 없으면 결국 shared_ptr 써야지
덧붙아면 동적할당 예외는 pop하기 전이라 상관없음 pop이후의 리스크만 관건임