2015-01-23 3 views
16

한 가정 허용 한 전체 식 회 이동된다 (의 이동 된 버전)에 전달 된 객체, 또는 완전히 다른을 다음 프로토

template<typename T>  
std::unique_ptr<T> process_object(std::unique_ptr<T> ptr); 
함수가 리턴 할 수

과 기능을 갖는다 목적.

다음과 같이이 함수를 사용하는 것이 합법적입니까?

std::unique_ptr<Widget> pw(new Widget()); 

pw = process_object(std::move(pw)); 

올바르게 기억하면 하나의 전체 식에서 개체를 두 번 이상 수정하는 것을 금지하는 C/C++ 규칙이 있습니다. 이 규칙이 여기에 적용됩니까? 그렇다면,이 관용구를 한 줄로 다르게 표현할 수있는 방법이 있습니까?

std::unique_ptr을 멸종 된 std::auto_ptr으로 대체하면 어떻게 될까요?

+0

'std :: unique_ptr &&'인수를 취하는'process_object'를 의미 했습니까? – Walter

+0

@Walter 왜 그렇게 생각하니? 'unique_ptr'의 소유권을 넘기는 것은 값에 의해 수행됩니다. –

+0

'auto_ptr'은 더 이상 사용되지 않습니다. – Walter

답변

20

다음과 같이이 함수를 사용하는 것이 합법적입니까?

네, 괜찮습니다.

올바르게 기억한다면 하나의 전체 표현식에서 개체를 두 번 이상 수정하는 것을 금지하는 C/C++ 규칙이 있습니다.

아닙니다. 순서가 지정되지 않은 액세스로 오브젝트를 두 번 이상 수정 (또는 수정하고 값 사용) 할 수 없습니다.

이 규칙이 여기에 적용됩니까?

아니요. 함수 인수를 평가하기 전에 함수 호출 전에 순서가 지정됩니다. 함수 호출은 할당 전에 순서가 지정됩니다. 따라서 두 개의 액세스 순서가 정해져 모두 양호합니다.

+7

뻔뻔한 플러그 : 나는 그래프로 규칙을 시각화하는 데 도움이되는 [sequencing rules] (http://josephmansfield.uk/articles/c++-sequenced-before-graphs.html)에 기사를 썼다. –

+2

@JosephMansfield 맥주를 사고 싶습니다. – bolov