std::shared_ptr pop() { std::lock_guard lock(m); if(data.empty()) throw empty_stack(); std::shared_ptr const res(std::make_shared(data.top())); // 왜 shared_ptr? data.pop(); return res; }


스레드 세이프 스택 설명하는 책에서 나온 예제인데 왜 그냥 데이터 그대로 리턴 안하고 shared_ptr로 리턴해야 좋은 거지?

책에 써있는 거와 검색해본바로는 리턴시 카피할 때 타입에 따라 익셉션이 발생할 수 있어서고 그러면 스택이 변경된 상태로 데이터만 유실되는 반면
shared_ptr은 복사될 때 noexcept이기 때문에 이거에서 안전해서라는데

다른 책에서 T 지역변수가 있고 함수 리턴 타입도 T면 처음부터 리턴할 곳에 데이터가 생성되기 때문에 리턴할 때 카피 안한다고 배웠거든?
그러면 위의 이유는 성립 안하잖아?