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

您无法轻松区分“真正的”右值和右值引用,但您似乎没有这样做的动机。你的过载很好。

问题是+=运算符丢失了右值性。有三种解决方案:

  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 回答