目的

2012-05-05 6 views
1

この質問は、コンストラクタの引数としてboost::shared<T>&の有用性を議論する以前のpost拡張:目的

class SomeClass { 
    SomeClass(const boost::shared_ptr<SomeOtherClass>&); 
} 

boost::shared_ptr<T>&提供任意の利点の代わりに、右辺値参照引数?特に

class SomeClass { 
    SomeClass(const boost::shared_ptr<SomeOtherClass>&&); 
}  

、マルチスレッドの設定のため、shared_ptrの型の右辺値参照して、コンストラクタは、任意のより有用次いでによって価値渡すことになるか、参照渡し?

+3

rvalue参照を使用すると、 'shared_ptr'を内部メンバーにコピーするのではなく_move_できます。 'shared_ptr'をコピーすると参照カウントが増えますが、これは最初に考えたよりもかなり高価です。スレッドセーフである 'shared_ptr'をコピーする際に、移動するものがスレッドセーフではないことに注意してください。 –

答えて

4

shared_ptrは特別ではありません。他のオブジェクトとほぼ同じルールが適用されます。 const rvalue参照パラメータを作成しますか?私は正当な理由が見当たらない。他のクラスの評価基準はどうですか?クラス自身の移動コンストラクタと移動代入演算子を除いて、ほとんどの場合、rvalue参照でオブジェクトを取得しないでください。あなたがオブジェクトのコピーを必要とするなら、あなたはこのように、値によってそれを取り、それを移動:

class SomeClass { 
    std::shared_ptr<SomeOtherClass> myptr; 
public: 
    SomeClass(std::shared_ptr<SomeOtherClass> yourptr) 
     :myptr(std::move(yourptr)) 
    {} 
}; 

コピーを必要としない場合は、あなたの意思ならばconst参照によってそれを取ります単にそれを調べることです、またはそれを変更するつもりならば、通常の参照です。

指定したオブジェクトを変更しないことを約束したい場合は、const std::shared_ptr<const SomeOtherClass> &を受け入れることができ、引数に内部のconst修飾子がない場合でも機能します。

+0

あなたが何かの所有権を奪っていることを強調したいのであれば、rvalue refパラメータはかなり受け入れられると思います。 – Xeo

+0

@Xeo:あなたが値で引数を取ってそれを移動すると、あなたはそれを所有しています。 –

1

右辺値はconstです。しかし、rvalueを取ることで、スワップだけが必要なので、所有権の移譲を迅速に行うことができます。

0

const rvalue参照のようなものはありません。何を意味するのかわかりません。それが関数に到達し、名前を持っていれば、それはconst左辺値参照と本質的に同じものになります(左辺値はルールです)。あなたはそれを動かすことは許されません。

コールサイトで何が意味するのか分かりません。確かに、それは人々の地獄を混乱させるだけの役割を果たすことができ、単純に悪いことです。

正直言って、もしそれがコンパイルされれば、ちょっと迷惑になります。私はそれが違法だとは言えません。

ここで、const部分を取り除くと、別の話があります。これでshared_ptrを "移動"できます。私はむしろshared_ptrには移動コンストラクタがありますが、おそらく疑問です。それは、常に動くことを意味します。受信エンティティは、供給された変数を引き継ぎ、恐らくそれを破壊する可能性があります。

+0

const rvalue参照のようなものがありますが、それはかなり役に立たないです。 –