2010-11-23 3 views
8

그냥 질문입니다. C++ Boost 라이브러리 (특히 boost :: thread 클래스)를 보면 "복사 할 수 없지만 함수에서 반환 할 수있는 객체를 정의하는 클래스는 어떻게 만들 수 있습니까?" 잘C++의 복사 가능하지만 움직일 수없는 객체 만들기

이 예제를 고려, 부스트 : 스레드 클래스는 내가 전에 언급 한 특성을 가지고 있으므로이 작업을 수행 할 수 있습니다 :

boost::thread make_thread(); 

void f() 
{ 
    boost::thread some_thread=make_thread(); 
    some_thread.join(); 
} 

음이 객체 부스트 : : 스레드를 복사 할 수 없음을 의미 함수에서 반환되었지만 가능합니다. 어떻게 가능합니까 ????

복사 생성자를 제공해서는 안되지만 함수에서 반환하는 방법을 어떻게 처리할까요? 복사 생성자를 사용할 필요가 없습니까?

고마워요

답변

4

이 r- 수치 참조를 통해 시맨틱을 이동 제공 C++ 1X에서 가능할 것이다.

class my_class { 
    private: 
    data_t* data_; 
    public: 
    my_class(const my_class& rhs)  // copy constructor 
    : data_(rhs.data_.clone()) 
    {} 
    my_class(my_class&& rhs)   // move constructor 
    : data_(rhs.data_) 
    { 
     rhs.data_ = NULL; 
    } 
    ~my_class() {delete data_;}  // noop if data_==NULL 

    my_class& operator=(my_class rhs) // copy assignment 
    { 
     this->swap(rhs); 
    } 
    my_class& operator=(my_class&& rhs)// move assignment 
    { 
     this->swap(rhs); 
    } 

    // ... 
}; 

복사 및 이동이 개별적으로 금지 될 수있다, 당신은 이동하지만, 복사 할 수는 없습니다 설치 클래스를 할 수 있습니다 : 당신은 separatedly 이동 구현 및/또는 복사이 수 사용.

물론 컴파일러가 아직 이동 의미 (std::auto_ptr, 할당 된대로 복사하지 않고 이동 한 이후)를 지원하지 않는 경우에도이 작업을 수행 할 수있는 몇 가지 마술이 있으므로 boost::thread 이동 의미가없는 경우

+0

C++ 1x는 무엇입니까? 나는 인터넷에서 c1x와 C++ 0x를 볼 수 있지만 C++ 1x는 볼 수 없다. 둘 다 속기입니까? –

+1

@Alex - 그것은 이미 2010 년이며 아직 발표하지 않았다는 사실에 대해 똑똑한 말을합니다. 더 똑똑한 카운터가 있습니다. 0x는 16 진수입니다. –

+0

@Alex : 2010 년 이전에 예상 되었기 때문에 C++ 0x라는 이름이 사용되었지만 제대로 작동하지 않았습니다. 많은 사람들은 여전히 ​​C++ 11 또는 C++ 12로 끝날지라도 "C++ 0x"를 고집합니다. – sbi

2

C++ 03에서이 작업을 수행하려는 경우 이는 C++의 고급 주제입니다. 예를 들어 Howard Hinnants Unique_ptr C++03 emulation을 참조하십시오.

기본적으로 C++ 과부하 해결의 몇 가지 미묘한 규칙을 악용하여 작동합니다. 특히 비 const 참조가 rvalue 임시 변수에 바인딩 할 수 없으며 non-const 임시 함수에서 여전히 non-const 변환 함수를 호출 할 수 있다는 규칙이 있습니다.

또한 auto_ptr 기술을 C ​​++ 03에서 사용하는 것으로 사용할 수 있습니다. 그러나 auto_ptr을 사용하면 변수를 복사 할 수 있지만 복사 한 객체의 자원을 도용 할 수 있기 때문에 여러 그룹으로 구분됩니다 (다른 그룹은 다른 의견을 가지고 있음). 이것에 관해서).