【发布时间】:2010-09-25 07:04:42
【问题描述】:
注意: 正如 sellibitze 所指出的,我不是最新的右值引用,因此我提出的方法包含错误,请阅读他的回答以了解哪个。
我昨天正在阅读Linus' rant 的一篇文章,并且(某处)有人对运算符重载进行咆哮。
抱怨似乎是,如果你有一个S 类型的对象,那么:
S a = b + c + d + e;
可能涉及很多临时工。
在 C++03 中,我们有复制省略来防止这种情况:
S a = ((b + c) + d) + e;
我希望最后一个... + e 被优化,但我想知道有多少临时创建了用户定义的operator+。
线程中有人建议使用表达式模板来处理这个问题。
现在,这个帖子可以追溯到 2007 年,但现在当我们想到消除临时性时,我们会想到 Move。
所以我在考虑我们应该编写的一组重载运算符不是为了消除临时性,而是为了限制它们的构造成本(窃取资源)。
S&& operator+(S&& lhs, S const& rhs) { return lhs += rhs; }
S&& operator+(S const& lhs, S&& rhs) { return rhs += lhs; } // *
S&& operator+(S&& lhs, S&& rhs) { return lhs += rhs; }
这组操作符看起来够吗?这是否可以概括(在您看来)?
*:这个实现假设可交换性,它不适用于臭名昭著的string。
【问题讨论】:
-
问题中没有说明:如果这个集合足够,这意味着我们有 3 个新的重载要为每个运算符添加......除了使用 Boost.Operator 我看不到自动生成它们的方法。从头到尾,这意味着 8
operator+forstd::string因为std::string和char const*混合...... -
呃,这太可怕了。他们称之为“解决方案”。噗
-
@litb:我同意你的感觉……尤其是当我想到
-、*、/和所有其他类似的运算符时。我猜数字类将有更多的理由从boost::addable和 co 继承。
标签: c++ operator-overloading c++11