1

文字列クラスがあります。一部の演算子は参照を返し、他の演算子は値を返します。値を返すものだけが、右辺値コピー コンストラクターまたは右辺値代入演算子を利用できます。

右辺値への参照で右辺値演算子を呼び出したいと思います。

これらを考えると:

String(const TCHAR* sz);
String(const String& s);    
String& operator+=(const TCHAR* sz);    
String& operator=(String&& r);

そして、このコード:

String x;
x = (String("fred") += "foo");

コピー コンストラクター、+= 演算子を呼び出しますが、次に COPY CONSTRUCTER を再度呼び出します。右辺値代入演算子を呼び出したい!

私はこれを追加しました:

String(String&& r) 

そして、それは違いはありません。

編集: += 演算子に値を返すようにすると、右辺値代入演算子が呼び出されることを確認しました。私は多くのパフォーマンステストを行いましたが、これを行うとすべてが大幅に遅くなります。

4

1 に答える 1

2

「本物の」右辺値と右辺値参照を簡単に区別することはできませんが、そうする動機はないようです。あなたの過負荷は大丈夫です。

+=問題は、演算子によって右辺値が失われることです。3つの解決策があります:

  1. 手動で右辺値にします。x = std::move(String("fred") += "foo");
  2. 非メンバーのオーバーロードを使用します。式の左側に変換関数を適用するなどの他の問題を解決するため、私は一般的にこれを好みます+=

    String& operator+=(String &lhs, const TCHAR* sz);
    String&& operator+=(String &&lhs, const TCHAR* sz);
    
  3. 参照修飾子を使用してoperator+=、右辺値に適用されたときに右辺値を返すようにします。これをサポートしているコンパイラはまだほとんどありません。

    String& operator+=(const TCHAR* sz) &;
    String&& operator+=(const TCHAR* sz) &&;
    
于 2012-12-07T23:25:22.777 に答える