2017-12-31 200 views
0

私は、他の何かを包むラッパーである移動可能なインスタンスを扱う関数を持っています。そのオブジェクトは、ラップされたオブジェクトへのアクセスの手段と、コピーが不可能であることを必要とするいくつかのチェックを提供する。インスタンスパラメータでブースト移動を使用する

(ユースケースは、ラッパーのデストラクタは、すべての値がアクセスしたことを主張すべきである値のテーブルである)私は、ラップされた型からカスタムCTORを定義し、移動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

限り、私はあなたが右辺値のための可動部をスキップして呼び出すことができますテストしてきたように 'バー(Movable(5)); 'http://coliru.stacked-crooked.com/a/a4c6bbeb20334fc6 – R2RT

+0

これはいいですね。それを避ける機会はありますか?非明示的な変換演算子/ ctorはそのノイズを避けるためのものです。 – Flamefire

+0

多分、私はC++ 03であまりにも高度なコードを書いていないが、私にとってはそうすべきではありません。私の例のシグネチャで 'boost :: rv 'に暗黙的に変換してあり、コンパイラは暗黙的に2回推論できません( '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 
関連する問題