算术运算符参数类型

时间:2016-12-07 17:24:41

标签: c++ operator-overloading

经常声明(例如这里cppreference)通过值定义算术运算符的左侧(lhs)参数有助于优化链式运算。

X operator+( X         lhs
           , X const & rhs )

为了确保我不会在函数中意外更改lhs,我喜欢通过值参数const声明我的。这会改变有关所需优化的行为吗?

X operator+( X const   lhs
           , X const & rhs )

1 个答案:

答案 0 :(得分:2)

+执行+=时,通过复制完成以启用特定习语:

inline X operator+(X lhs, const X& rhs) {
    lhs += rhs;
    return lhs;
}

另一方面,如果您通过lhs引用const X&,则必须自行制作副本,例如

inline X operator+(const X& lhs, const X& rhs) {
    X res(lhs); 
    res += rhs;
    return res;
}

或构建一个新对象,如下所示:

inline X operator+(const X& lhs, const X& rhs) {
    X res; 
    ... // Modify res to contain the sum of lhs and rhs
    return res;
}

如果您使用的是惯用法,编译器可以通过复制一次来优化+链。编译器注意到你这样做

lhs + rhs1 + rhs2

lhs + rhs1的结果是一个丢弃的副本,可以在构建(lhs + rhs1) + rhs2时重复使用,而无需再次执行复制。

另一方面,如果您使用上述替代方案之一,编译器将需要为链中的每个操作制作副本。