2017-12-31 126 views
0

나는 다른 것 주위의 래퍼 인 이동 전용 인스턴스를 다루는 함수를 가지고있다. 이 객체는 래핑 된 객체에 대한 액세스 방법과 복사가 불가능한 일부 검사를 제공합니다. (사용 사례는 래퍼의 dtor가 모든 값에 액세스했다고 주장해야하는 값의 테이블입니다.)인스턴스 매개 변수로 부스트 이동 사용하기

랩핑 된 유형에서 사용자 정의 ctor를 정의하고 이동자/할당을 구현했습니다.

내가 인해 시도 사본에 오류를 받고 있어요 그러나

: error: 'Movable::Movable(Movable&)' is private within this context

그것은 C++ 11에서 잘 작동하지만 C++ 03에 이동성이 필요합니다. 래퍼를 명시 적으로 인스턴스화하지 않고이를 함수로 옮기지 않으면 어떻게해야합니까?

MWE는 :

#include <boost/move/move.hpp> 
#include <iostream> 

class Movable{ 
    BOOST_MOVABLE_BUT_NOT_COPYABLE(Movable) 
public: 
    int i; 
    Movable(int j):i(j){} 
    Movable(BOOST_RV_REF(Movable) other) // Move constructor 
     : i(boost::move(other.i)) 
    {} 

    Movable& operator=(BOOST_RV_REF(Movable) other) // Move assignment 
    { 
     if(this != &other) 
      i = boost::move(other.i); 
     return *this; 
    } 
}; 

void bar(Movable mov){ 
    mov.i = 22; 
    std::cout << mov.i; 
} 

int main(int argc, char* argv[]) 
{ 
    bar(5); 
    return 0; 
} 
+0

지금까지 내가 당신이를 rvalue에 대한 이동 부분을 생략하고 호출 할 수 있습니다 테스트 한대로' bar (Movable (5));'http://coliru.stacked-crooked.com/a/a4c6bbeb20334fc6 – R2RT

+0

글쎄요. 심지어 그것을 피할 수있는 기회는 무엇입니까? 비 명시 적 변환 연산자/ctor는 해당 노이즈를 피하기위한 것입니다. – Flamefire

+0

어쩌면 몇 가지 트릭이 있습니다. C++ 03에서 너무 진보 된 코드를 작성하지는 않았지만, 저에게 있어서는 안됩니다. 당신은 이미 내 예제의 서명을 사용하여'boost :: rv '으로 암시 적 변환을하고 컴파일러는 내재적 인 두 번을 추론 할 수 없습니다 ('5 -> Movable (5) -> boost :: rv (Movable (5))' – R2RT

답변

0

문제는 암시 적 변환 생성자는 복사 생성자 억제을 방해하는 것으로 나타납니다.

하나는

Movable m(5); 
bar(boost::move(m)); 

또는

bar(Movable(5)); 

당신이 명시 적으로 생성자에 대한 선택해야합니다하기 위해 사용합니다. 분명히, 즉 당신도 그것을 explicit를 표시 할 수 있습니다 의미 :

Live On Coliru

#include <boost/move/move.hpp> 
#include <iostream> 

class Movable{ 
    BOOST_MOVABLE_BUT_NOT_COPYABLE(Movable) 
public: 
    int i; 
    explicit Movable(int j):i(j){} 
    Movable(BOOST_RV_REF(Movable) other) // Move constructor 
     : i(boost::move(other.i)) 
    {} 

    Movable& operator=(BOOST_RV_REF(Movable) other) // Move assignment 
    { 
     if(this != &other) 
      i = boost::move(other.i); 
     return *this; 
    } 
}; 

void bar(Movable mov){ 
    std::cout << mov.i << " "; 
    mov.i = 22; 
    std::cout << mov.i << "\n"; 
} 

int main() { 
    Movable m(5); 
    bar(boost::move(m)); 

    bar(Movable(6)); 
} 

인쇄

5 22 
6 22