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

问题是这些是不同的签名,但是所有可以与一个一起使用的参数也可以与另一个一起使用,因此编译器不可能根据参数来消除需要调用的函数的歧义。

您可能打算提供两个分别采用右值引用左值引用的重载。另请注意,从第一个重载返回引用可能没有意义。

请注意,仅当您确实需要区分两个用例时才需要使用右值左值operator+引用重载,但一般定义不需要这种区分,因为它不会修改参数。常见的实现方式operator+是:

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

性能可以稍微提高一点,以允许对的第一个或第二个参数进行移动operator+,但这需要两个位置的左值 /*rvalue* 的 4 种不同组合( lvalue + * lvalue; lvalue +*rvalue*; rvalue +*左值*;右值+*右值*)

于 2012-12-07T18:39:13.430 回答