【发布时间】:2014-11-21 10:08:57
【问题描述】:
我有一个基础课,比如说MyVector<T>。我希望以下表达式尽可能懒惰(尽可能有效):
MyVector<int> x = a + b + c;
+ 的语义是连接向量,所以[1,2,3] + [2,3,4] 必须导致[1,2,3,2,3,4]。假设我有operator+=,我可以在任何需要的地方依赖它。我认为以下实现足以满足a+b 被评估的情况:
template<typename T>
MyVector<T> operator+(MyVector<T> const &lhs, MyVector<T> const &rhs)
{
return MyVector<T>(lhs)+=rhs;
}
然后我将有一个右值(a+b 的结果)和一个左值(c)。所以我想我必须写这样的东西:
template<typename T>
MyVector<T> ??? operator+(MyVector<T> &&lhs, MyVector<T> const &rhs)
{
???;
}
这里应该返回什么类型以及如何组装?
【问题讨论】:
-
只是我的两分钱:如果我在向量的上下文中阅读
+,我正在考虑线性组合,例如(对于标量值)(1, 2, 3) + (4, 5, 6) = (5, 7, 9),我希望它适用于定义+运算符的每种类型 T。我会使用operator<< (MyVector<T>&, MyVector<T>&)连接,这样就可以写成x = a << b。 -
如果你想偷懒,你应该看看表达式模板。这使您可以累积所有连接,然后一次执行它们,这意味着您知道结果向量的最终大小。
-
@quantdev 即使移动构造和移动分配正确,它不会导致
MyVector<T>的额外实例吗? -
@SebastianRedl 我不认为这个问题会走那么远。让我们暂时不考虑它们。 :-)
-
@JonathanWakely 更好:
MyVector<T> res(lhs); res += rhs; return res;更易读,可以使用 NRVO,如果失败仍然会移动。
标签: c++ c++11 operator-overloading