gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:22:32 26 4
gpt4 key购买 nike

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

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

鉴于这些:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com