我想根据您的问题,您想要做的是声明相应的 operator= private ,使其不再可访问。
因此您想重载匹配的签名(a*b) = c
。我同意左侧部分是一个表达式,因此右值将是一个更好的匹配。但是,您忽略了这样一个事实,即这是函数的返回值,如果您重载函数以返回右值,编译器将抱怨重载无效,因为重载规则不考虑返回值。
如此处所述,用于赋值的运算符重载始终是内部类定义。如果有像重载决议这样的非成员签名void operator=(foo assignee, const foo& assigner);
可以将第一部分匹配为右值(那么您可以删除它或将其声明为私有)。
因此,您可以从两个世界中进行选择:
- 接受这样一个事实,即用户可以编写愚蠢的东西,例如
(a*b) = c
这并没有错,但将 c 的值存储在无法访问的临时文件中
- 使用
const foo operator*(const foo& lhs, const foo& rhs)
不允许(a*b) = c
和牺牲移动语义的签名
代码
#include <utility>
class foo {
public:
foo() = default;
foo(const foo& f) = default;
foo operator*(const foo& rhs) const {
foo tmp;
return std::move(tmp);
}
foo operator=(const foo& op) const {
return op;
}
private:
// doesn't compile because overloading doesn't consider return values.
// conflicts with foo operator=(const foo& op) const;
foo && operator=(const foo& op) const;
};
int main ( int argc, char **argv ) {
foo t2,t1;
foo t3 = t2*t1;
foo t4;
(t2 * t1) = t4;
return 0;
}