学習中にstd::move
、奇妙な問題を見つけました。
完全なプログラムに何もしないデストラクタだけを追加すると、コンパイル エラーが発生します。
#include <iostream>
using namespace std;
class M {
public:
int database = 0;
M &operator=(M &&other) {
this->database = other.database;
other.database = 0;
return *this;
}
M(M &&other) { *this = std::move(other); }
M(M &m) = default;
M() = default;
~M() { /* free db */ }
};
class B {
public:
M shouldMove;
//~B(){} //<--- ## Adding this line will cause compile error. ##
};
int main() {
B b;
B b2 = std::move(b); //## error at this line if the above line is added
return 0;
}
ライブコード: https://ideone.com/UTR9ob
エラーは invalid initialization of non-const reference of type 'B&' from an rvalue of type 'std::remove_reference<B&>::type {aka B}'
です。
質問:
- (1) それを強制する C++ 構文のルールはどれですか? 言い換えれば、エラーは何を意味するのでしょうか?
- (2) ほとんど何もしない (例: デバッグ ログを出力するだけ) デストラクタを に追加したい場合、代わりに 5 つのルール
B
に従う必要がありますか? いいえの場合、コンパイルするにはどうすればよいですか? という理由だけで 5 のルールに従うことは、私の意見ではあまりにも退屈で汚いことです。
ゼロのルールは良い習慣 だと思います。
しかし、この例からすると、違反するとコンパイルエラーになるというのは難しいルールのように思えます。