なぜC ++ 0xのが右辺値参照ではないデフォルトはありますか?
質問
次期C ++標準、C ++ 0xののクールな新機能の1つを、「右辺値参照」です。
:右辺値参照は、(通常、一時的にのみconst
基準に結合させることができる)一時的な値にバインドすることができることを除いて、左辺値(正常)参照、に似ています
void FunctionWithLValueRef(int& a) {...}
void FunctionWithRValueRef(int&& a) {...}
int main() {
FunctionWithLValueRef(5); // error, 5 is a temporary
FunctionWithRValueRef(5); // okay
}
だから、なぜ彼らは、彼らが一時にバインドできるようにするだけではなく、通常の参照の制限を除去する、まったく新しいタイプを発明したのですか?
解決
これは無意味だろう。あなたは、関数の中でものを変更するだろう、との事は実際に一時的だったので、変更はすぐに失われてしまいます。
新しいタイプの理由は、実際には右辺値とするものではありませんかを決定することができるようにする必要性から生じます。そうしてあなたは、実際に彼らが使用されているクールなもののためにそれらを使用することができます。
string toupper(string && s) { // for nonconst rvalues
for(char &c : s) make_uppercase(c);
return move(s); // move s into a returned string object
}
string toupper(string const& s) { // for the rest
// calls the rvalue reference version, by passing
// an rvalue copy.
return toupper(string(s));
}
さて、あなたはいくつかの右辺値を持っていると右辺値が直接私たちが知っているので、一時的には使い捨てのものは、とにかくので、私達はちょうどaswellそれを変更してコピーする必要はありませんが、修正することができ、それがTOUPPERに渡す場合それ。また、同じ観察が動き、コンストラクタと呼ばれるものに使用されており、移動割り当てを。右側はコピーされませんが、そのものはわずかの距離に盗まれ、*this
に移動されます。
あなたは右辺値は、非const左辺値参照と結合することができることを言っていたならば、あなたはそれが左辺値(名前付きオブジェクト)、または最終的には右辺値(一時的な)を参照するかどうかを把握する方法はありません。
<時間>これはとにかくおそらくより少し知っているのですが、便利、あなたはメンバ関数に左辺値または右辺値REF-修飾子を置くことができます。ここで自然に暗黙オブジェクトパラメータに右辺値参照の既存のセマンティクスを拡張例では、ある
struct string {
string& operator=(string const& other) & { /* ... */ }
};
さて、あなたはもう言うことはできません。
string() = "hello";
は混乱して、実際にほとんどの時間感覚を作っていません。 &
上記の代入演算子は左辺値だけで呼び出すことができることは何を言っているん。同じことは、&&
置くことによって、右辺値のために行うことができます。
他のヒント
参照の新しい種類を追加すると、方法の2つのオーバーロードを書くことができますのでます:
void CopyFrom(MyClass &&c)
{
dataMember.swap(c);
}
void CopyFrom(const MyClass &c)
{
dataMember.copyTheHardWay(c);
}
参照の新しい種類を受け入れるバージョンは、その変数が他の場所で使用する予定がないので、それが受ける変数を変更することが許可されています。だから、それの内容を「盗む」ことができます。
これは、この機能が追加された全体の理由があります。参照のいずれかのタイプを保持して所望の目的を達成できないでしょう。