あなたの質問によると、あなたがやりたいことは、対応する operator= private を宣言して、もうアクセスできないようにすることだと思います。
したがって、一致する署名をオーバーロードする必要があります(a*b) = c
。左の部分は式であるため、右辺値の方が適切であることに同意します。ただし、関数をオーバーロードして右辺値を返す場合、これが関数の戻り値であるという事実を無視しています。オーバーロード規則は戻り値を考慮しないため、コンパイラは無効なオーバーロードについて文句を言います。
ここで述べたように、代入の演算子オーバーロードは常に内部クラス定義です。オーバーロード解決のような非メンバー署名がある場合はvoid operator=(foo assignee, const foo& assigner);
、最初の部分を右辺値として一致させることができます (その後、それを削除するか、プライベートに宣言することができます)。
したがって、次の 2 つの世界から選択できます。
- ユーザーは間違っていないような愚かなことを書くことができるという事実を
(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;
}