私は、他の何かを包むラッパーである移動可能なインスタンスを扱う関数を持っています。そのオブジェクトは、ラップされたオブジェクトへのアクセスの手段と、コピーが不可能であることを必要とするいくつかのチェックを提供する。インスタンスパラメータでブースト移動を使用する
(ユースケースは、ラッパーのデストラクタは、すべての値がアクセスしたことを主張すべきである値のテーブルである)私は、ラップされた型からカスタム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;
}
限り、私はあなたが右辺値のための可動部をスキップして呼び出すことができますテストしてきたように 'バー(Movable(5)); 'http://coliru.stacked-crooked.com/a/a4c6bbeb20334fc6 – R2RT
これはいいですね。それを避ける機会はありますか?非明示的な変換演算子/ ctorはそのノイズを避けるためのものです。 – Flamefire
多分、私はC++ 03であまりにも高度なコードを書いていないが、私にとってはそうすべきではありません。私の例のシグネチャで 'boost :: rv'に暗黙的に変換してあり、コンパイラは暗黙的に2回推論できません( '5 - > Movable(5) - > boost :: rv (Movable(5))' –
R2RT