홈>
std :: vector에 대해 이동 의미론이있는 단항 산술 연산자를 구현하고 싶습니다. rvalue에 적용되는 연산자 내부의 할당을 피하는 것이 목적입니다.
문제 : 다음 연산이 컴파일되지 않습니다 : c =-(a + b)
이것이 컴파일되지 않는 이유는 이진 산술 연산자 + std :: vector에 대해 구현 한 것이 const lvalue를 반환하기 때문입니다 (따라서 컴파일러는 (a + b) = c에 대해 불평합니다.) .
이진 + 연산자
template<class T, class AllocVect1, class AllocVect2>
inline const std::vector<T> operator+ (
const std::vector<T, AllocVect1> &v1,
const std::vector<T, AllocVect2> &v2) {
std::vector<T> vout;
*Compute vout = v1 + v2*
return vout;
}
단항 연산자
template<class T, class Alloc>
inline const std::vector<T>& operator- (std::vector<T, Alloc> &&v) {
std::transform (
v.begin (),
v.end (),
v.begin (),
[](const auto &val){return -val;});
return v;
}
- 답변 # 1
벡터를 값으로 전달하고 반환합니다.
직관적이지 않은 것, 다음 사항을 고려하면 말이됩니다 :
<올>임시 객체를 값 매개 변수로 암시 적으로이동할 수 있습니다. 복사가 발생하지 않습니다. 마치
std::move
를 부르는 것처럼 지역 변수에.이 개체 (매개 변수)는
const
가 없기 때문에 전체 수정이 가능합니다. 한정자.수정 된 객체를 반환 할 수 있으며 이동 시맨틱이 다시 암시 적으로 적용됩니다. lvalue 또는 rvalue 참조가 아닌 로컬 변수에 대한 참조를 반환해서는 안됩니다.
이 연산자는 rvalue (이동 + 수정 + 이동)와 l 값 (복사 + 수정 + 이동)으로 호출 할 수 있습니다.
이 말은
const Param&
에 대한 별도의 과부하의 장점이있다 그리고Param&&
자세한 내용은 별도의 답변으로 이미 설명되어 있습니다.'Want Speed? Pass by value'는 얼마나 진실합니까?
Hub Sutter의 CppCon 2014 토크에서 가치 평가자 멤버 기능이 권장되지 않는 이유는 무엇입니까 (Back to Basics : Modern C ++ Style)