我有一个带有移动构造函数,赋值运算符,复制构造函数,赋值运算符的类A
。
该课程使用(非朋友,非会员)
template <typename T>
const A<T> operator*(A<T> lhs, const A<T>& rhs)
{
lhs *= rhs;
return lhs;
}
和
template <typename T>
A<T>& A<T>::operator*=(const A<T>& rhs)
{
// assert sizes are the same
// This is essentially a std::vector<T> wrapper
for (each variable) {
variable *= rhs.variable;
}
return *this;
}
如果在我的main()
函数中,我打电话给:
obj1 = (obj2 * obj3);
,然后是日志输出(由于拷贝构造函数中标记不良等原因,某些名称可能有误):
obj2 copy-constructed
obj2 move-constructed
obj1 copy-assigned from obj2
而对obj1 = obj2; obj1 *= obj3;
我得到:
obj1 copy-assigned from obj2
看起来乘法运算符将被称为相同的方式。
第二种实现真的如此不同吗? (至关重要的是,这更好,对吗?)有些阅读使得这些事情都被称为合乎逻辑似乎是合乎逻辑的 - 我只是好奇我是否可以通过将乘法分成两个语句来跳过大量的调用,等
Also
:非朋友,非成员运算符*(..)按值获取第一个参数,然后不需要创建临时对象。这仍然是使用复制构造函数(构造参数),但是this link (pass-by-value-or-const-reference)使我觉得通过这种方式定义它可能会变得更糟。是吗?