0

これらの署名が両方ともあると、コンパイルエラーが発生します。

String& operator+(String&& a, const TCHAR* b)
String operator+(String a, const TCHAR* b)

string.cpp(97): error C2593: 'operator +' is ambiguous
      string.cpp(34): could be 'String &operator +(String &&,const TCHAR *)'
      string.cpp(24): or       'String operator +(String,const TCHAR *)'

彼らは違いませんか????? 両方使えばパフォーマンスが上がる気がします。一方、+演算子は常に右辺値を処理するため、これはあいまいですか?

vc++2010コンパイラ

4

1 に答える 1

3

問題は、これらが異なるシグニチャであるということですが、一方で使用できるすべての引数はもう一方でも使用できるため、コンパイラは、引数に応じて呼び出す必要のある関数を明確にすることができない可能性があります。

おそらく、右辺値参照左辺値参照をそれぞれ取る2つのオーバーロードを提供することを意図していました。また、最初のオーバーロードから参照を返すことはおそらく意味がないことに注意してください。

右辺値と左辺値の参照オーバーロードの使用は、2つのユースケースを本当に区別する必要がある場合にのみ必要ですが、の一般的な定義でoperator+は、引数が変更されないため、その区別は必要ありません。実装の一般的な方法operator+は次のとおりです。

T operator+( T lhs, T const & rhs ) {
   return lhs+=rhs;
}

パフォーマンスを少し改善して、への最初または2番目の引数のいずれかを移動できるようにすることができますが、両方の位置に左辺値/ *右辺値*operator+の4つの異なる組み合わせが必要です(左辺値+*左辺値;左辺値+*右辺値*;右辺値+*左辺値*;右辺値+*右辺値*)

于 2012-12-07T18:39:13.430 に答える