2010-11-23 8 views
8

ちょうど質問です。 C++のBoostライブラリ(特にboost :: threadクラス)を見てみると、「コピーできないが関数から返すことができるオブジェクトを定義するクラスはどうやって作成できますか?コピー可能でも移動可能なオブジェクトをC++で作成する

さて、この例を考えることは、これを行うことが可能であるので、ブースト::スレッドクラスは、私は前に述べた特性があります。

boost::thread make_thread(); 

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

まあこれはオブジェクトブースト::スレッドをコピーすることができないことを意味します関数から返された場合、これは可能です。 これはどのように可能ですか?

私は、コピーコンストラクタを提供してはいけないと思いますが、関数からの返却にどう対処するのですか?それはコピーコンストラクタを使用する必要はありませんか?

ありがとう

答えて

4

これは右辺値参照を経由して移動セマンティクスを提供してC++の1x、で可能になります。これを使用して、あなたはseparatedly移動および/またはコピー実装できます

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); 
    } 

    // ... 
}; 

コピーや移動を個別に禁止されることができ、あなたが移動しますが、コピーされないことができ、セットアップクラスをすることができます。もちろん

、そこ(に割り当てられたときに代わりにコピーのすべての移動後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一時変数にバインドできない規則であり、const以外の一時関数に対しても非const変換関数を呼び出すことができます。

auto_ptrは、C++ 03で採用されている手法を使用することもできますが、auto_ptrは変数をコピーできますが、コピー元のオブジェクトからリソースを奪うことができるため、これについて)。

関連する問題