我有一个字符串类。一些运算符返回引用,其他运算符返回值。只有返回值的那些才能利用右值复制构造函数或右值赋值运算符。
我希望在对右值的引用上调用右值运算符。
鉴于这些:
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)
这没什么区别。
编辑: 我确认如果我让我的 += 运算符返回一个值,将调用右值赋值运算符。我做了很多性能测试,这样做会使一切变慢。
最佳答案
您不能轻易区分“真正的”右值和右值引用,但您似乎没有这样做的动机。你的重载没问题。
问题是 +=
运算符丢失了右值。三种解决方案:
- 手动将其设为右值:
x = std::move(String("fred") += "foo");
使用非成员重载。我通常更喜欢这个,因为它解决了其他问题,例如将转换函数应用于
+=
表达式的左侧。String& operator+=(String &lhs, const TCHAR* sz); String&& operator+=(String &&lhs, const TCHAR* sz);
使用引用限定符,以便
operator+=
在应用于右值时返回右值。很少有编译器支持这一点。String& operator+=(const TCHAR* sz) &; String&& operator+=(const TCHAR* sz) &&;
关于c++ - 我希望在对右值的引用上调用基于右值的函数......如果有这样的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13772557/