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;
}
지금까지 내가 당신이를 rvalue에 대한 이동 부분을 생략하고 호출 할 수 있습니다 테스트 한대로' bar (Movable (5));'http://coliru.stacked-crooked.com/a/a4c6bbeb20334fc6 – R2RT
글쎄요. 심지어 그것을 피할 수있는 기회는 무엇입니까? 비 명시 적 변환 연산자/ctor는 해당 노이즈를 피하기위한 것입니다. – Flamefire
어쩌면 몇 가지 트릭이 있습니다. C++ 03에서 너무 진보 된 코드를 작성하지는 않았지만, 저에게 있어서는 안됩니다. 당신은 이미 내 예제의 서명을 사용하여'boost :: rv'으로 암시 적 변환을하고 컴파일러는 내재적 인 두 번을 추론 할 수 없습니다 ('5 -> Movable (5) -> boost :: rv (Movable (5))' –
R2RT