c++ - 我希望在对右值的引用上调用基于右值的函数......如果有这样的事情

标签 c++ visual-studio-2010 visual-c++ c++11

我有一个字符串类。一些运算符返回引用,其他运算符返回值。只有返回值的那些才能利用右值复制构造函数或右值赋值运算符。

我希望在对右值的引用上调用右值运算符。

鉴于这些:

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) 

这没什么区别。

编辑: 我确认如果我让我的 += 运算符返回一个值,将调用右值赋值运算符。我做了很多性能测试,这样做会使一切变慢。

最佳答案

您不能轻易区分“真正的”右值和右值引用,但您似乎没有这样做的动机。你的重载没问题。

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

  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) &&;
    

关于c++ - 我希望在对右值的引用上调用基于右值的函数......如果有这样的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13772557/

相关文章:

c++ - 如何找到 FFmpeg 错误代码的含义?

c++ - 尽管调用者期望完全相同的类型,但从std::function类型传递变量失败

c++ - 为什么我会收到这些 'already defined' 链接器错误?

windows - QtCreator 无法打开包含文件 (Windows)

android - 适用于 Android VS2010 的单声道 : Cannot view layout in designer

visual-c++ - 金字塔中的错误意味着某些尺寸图像的平移过滤?

c++ - 从 boost::variant 按索引获取项目,就像使用 std::variant 一样

javascript - 在 VS2010 中更改 javascript 文件 "ignored"

c++ - VS11是steady_clock,稳定吗?

.net - 在 Windows 窗体中调用