연구용 표준 C++ 라이브러리의 구현을 작성하고 있습니다.std :: for_each에서 std :: move (f)를 반환합니다.
C++ 11 표준에 따르면 for_each
은 std::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++ 표준 라이브러리
당신은하지 않고() 반환 값을 이동하지 않아야에서
이 경우'std :: move (f)'를 반환하는 것은'f'를 반환하는 것과 거의 비슷합니다. C++ 11은 함수 매개 변수에 대한 반환 값 최적화를 금지합니다 (그러나 여전히 암시 적 이동을 허용 함). 그래서 저의 유일한 차이점은,'return f; '는 rvalue가 과도한 모호성을 일으키거나 생성자를 찾을 수 없다면 lvalue로 고려해야한다는 것입니다. 그러나 그러한 경우에는'복귀 움직임 (f)'은 실패로 끝날 것이다. –
예를 들어,이 동작은'struct function {Function (Function &);}과 같이 정의 된 'Function'에 대해 다를 것입니다. };'. 이 클래스에는 이동 생성자가없고 rvalues를 허용하지 않는 복사 생성자가 있습니다. 'move (f)'리턴은 잘못 형성된 것이고'return f; '는 잘 형성 될 것이다. –
하지만 다시, 함수 객체에 대한 라이브러리 제약 조건이 무엇인지 잘 모르겠습니다. 아마 그들은'Function'을 rvalues에서 초기화 할 수 있어야합니다. 어떤 경우에는 내가 볼 수있는 한 사실상 차이가 없을 것입니다. –