>

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 참조가 아닌 로컬 변수에 대한 참조를 반환해서는 안됩니다.

    template<class T>
    std::vector<T> operator-(std::vector<T> v) { // 1.
        std::for_each( // 2.
            v.begin(), 
            v.end(), 
            [](T& val) {val = -val;});
        return v; // 3.
    }
    
    

    이 연산자는 rvalue (이동 + 수정 + 이동)와 l 값 (복사 + 수정 + 이동)으로 호출 할 수 있습니다.

    이 말은 const Param& 에 대한 별도의 과부하의 장점이있다  그리고 Param&& 자세한 내용은 별도의 답변으로 이미 설명되어 있습니다.

    'Want Speed? Pass by value'는 얼마나 진실합니까?

    Hub Sutter의 CppCon 2014 토크에서 가치 평가자 멤버 기능이 권장되지 않는 이유는 무엇입니까 (Back to Basics : Modern C ++ Style)

  • 이전 java - SOAP 요청에 헤더를 추가하는 방법?
  • 다음 iOS Swift,"on my iphone"폴더의 URL은 무엇입니까