链算子中的临时优化

问题描述

我有一个Array,构造新实例的成本很高。我定义了operator+,以便能够像这样链接起来。

class Array
{
public:
    //...
    Array& operator+=(Array const&);
    Array operator+(Array const&);
};

Array a,b,c,d;
Array e = a + b + c + d; //a+b->Temp,Temp+c->Temp2,Temp2+d->e,BAD!

我希望它能够使用operator+=来节省构建新实例的成本,而不是使用operator+来构建新实例。我尝试使用参考限定词,如下所示:

Array operator+(Array const&) &;
Array& operator+(Array const&) &&; //call += internally

但是在Temp+c->Temp之后,Temp+d将调用operator+() &,它仍会创建新实例。

编辑:我尝试过

Array&& operator+(Array const&) &&
{
    //...
    return std::move(*this);
}

哪个似乎有用,但是它会悬挂吗?因为Array e = a + b + c + d;将调用move构造函数将最终的临时变量移至e中,所以我可以在move构造函数中做一些技巧,以防止在表达式之后存储临时变量时释放资源,如果我是对的

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...