です。 左辺を関数に渡す場合(実際には、住所の演算子&が適用される名前を持つものを渡している場合)、クラスのコピーコンストラクタが呼び出されます。
void foo(vector<char> v)
{
...
}
int bar()
{
vector<char> myChars = { 'a', 'b', 'c' };
foo(myChars); // myChars gets COPIED
}
あなたはその後、右辺値(大体、名前を持っていないと、そのアドレス演算子&を適用することができないために何か)とクラスが移動コンストラクタを持ち、オブジェクトを渡す場合(エイリアスを作成するのと同じではなく、オブジェクトの勇気を新しいスケルトンに移して、前のスケルトンを無用にします)。
以下のfoo()
の呼び出しでは、make_vector()
の結果はの値です。
void foo(vector<char> v);
{
...
}
vector<char> make_vector()
{
...
};
int bar()
{
foo(make_vector()); // myChars gets MOVED
}
いくつかのSTLクラスは、移動コンストラクタを持っていますが、はコピーを持っていない。したがって、それは返すオブジェクト(つまりvector
の移動コンストラクタが呼び出されます)foo()
への入力で与えられたときがを移動されています本質的にコピー不可能であることを意図しているので(例えば、unique_ptr
)、コンストラクタがあります。あなたはそれを関数に渡すときにunique_ptr
のコピーを手に入れません。
コピーコンストラクタを持つクラスであっても、std::move
関数を使用してlvalueからrvalueに引数を変更することで強制的にセマンティクスを強制できますが、別名を作成せずに転送します呼び出す関数へのオブジェクトの所有権。つまり、別の値に再割り当てしたり、破棄したりする以外に、元のオブジェクトで他の操作を行うことはできません。例えば
:あなたは左辺値と右辺値参照のこの全体の主題を見つけて、あいまいなセマンティクスを移動した場合
void foo(vector<char> v)
{
...
}
vector<char> make_vector()
{
...
};
int bar()
{
vector<char> myChars = { 'a', 'b', 'c' };
foo(move(myChars)); // myChars gets MOVED
cout << myChars.size(); // ERROR! object myChars has been moved
myChars = make_vector(); // OK, you can assign another vector to myChars
}
は、それは非常に理解しやすいです。私は個人的にこのチュートリアルは非常に役に立った:
http://thbecker.net/articles/rvalue_references/section_01.html
あなたはhttp://www.isocpp.org上やYouTubeにもいくつかの情報を見つけることができるはずです(スコット・マイヤーズセミナーを探してください)。
あなたのシングルコロン ':'はダブルコロン '::'ではないでしょうか? – 0x499602D2
@Davidはい、それらは二重コロン '::'でなければなりません。 –
参照渡しのコピーパス(好ましくはconst参照)を防ぐためです。 –