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 쓰면 동적할당이라는 추가적인 예외 생성 포인트가 있는거 아님?