2013-08-24 4 views
6

연구용 표준 C++ 라이브러리의 구현을 작성하고 있습니다.std :: for_each에서 std :: move (f)를 반환합니다.

C++ 11 표준에 따르면 for_eachstd::move(f)을 반환합니다.

template <class InputIterator, class Function> 
Function for_each(InputIterator first, InputIterator last, Function f); 

Returns: std::move(f). 

함수 범위 로컬 변수는 반환 될 때 move-construct라는 생각을했습니다. move(f)을 명시 적으로 반환해야합니까? Josuttis에의 는 C++ 표준 라이브러리

당신은하지 않고() 반환 값을 이동하지 않아야에서

+3

이 경우'std :: move (f)'를 반환하는 것은'f'를 반환하는 것과 거의 비슷합니다. C++ 11은 함수 매개 변수에 대한 반환 값 최적화를 금지합니다 (그러나 여전히 암시 적 이동을 허용 함). 그래서 저의 유일한 차이점은,'return f; '는 rvalue가 과도한 모호성을 일으키거나 생성자를 찾을 수 없다면 lvalue로 고려해야한다는 것입니다. 그러나 그러한 경우에는'복귀 움직임 (f)'은 실패로 끝날 것이다. –

+1

예를 들어,이 동작은'struct function {Function (Function &);}과 같이 정의 된 'Function'에 대해 다를 것입니다. };'. 이 클래스에는 이동 생성자가없고 rvalues를 허용하지 않는 복사 생성자가 있습니다. 'move (f)'리턴은 잘못 형성된 것이고'return f; '는 잘 형성 될 것이다. –

+1

하지만 다시, 함수 객체에 대한 라이브러리 제약 조건이 무엇인지 잘 모르겠습니다. 아마 그들은'Function'을 rvalues에서 초기화 할 수 있어야합니다. 어떤 경우에는 내가 볼 수있는 한 사실상 차이가 없을 것입니다. –

답변

2

. 언어 규칙에 따르면, 표준은 다음과 같은 코드를

X foo() 
{ 
X x; 
... 

return x; 
} 

다음과 같은 동작이 보장되도록 지정 : X는 접근 사본이 나 생성자를 이동하는 경우

•이 컴파일러는 을 생략하다하도록 선택할 수 있습니다 부. 반환 값 최적화 ((N) RVO)은 C++ 11 이전에 지정되었으며 대부분의 컴파일러에서 을 지원합니다.

• 그렇지 않으면 X에 이동 생성자가있는 경우 x가 이동됩니다.

• 그렇지 않으면 X에 복사 생성자가 있으면 x가 복사됩니다.

? 그렇지 않으면 컴파일 타임 오류가 발생합니다.

가입일 §25.2.4 (의 for_each)

사용 조건 : 기능 MoveConstructible (표 20)의 요구 사항을 충족한다. [참고 : 기능이 CopyConstructible (복사 가능 생성자) (표 21) .- 끝 노트의 요구 사항을 충족 할 필요는 없다]는 외부 변이 상태를 읽을 수 있다는 보장 할 수 std::move(f)

합니다.

+0

'Function'의 요구 사항을 놓쳤습니다. 고마워. – kukyakya

+1

그러나 질문은 함수 매개 변수 "f"에 대해 묻는 반면 표준은 대신 지역 변수를 가진 예제를 제공합니다. RVO가 함수 매개 변수에 적용됩니까? – Hugues

관련 문제