C++ lavalueとかrvalueとかコピーコンストラクタが分かっていない
これ見て何がなんだか分からない。
元ネタ: https://stackoverflow.com/questions/45270810/pass-enum-class-as-a-parameter-of-constructor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
enum class EmployeeType {Employee, Manager, Sales, Unknown}; class Employee { public: Employee() = delete; Employee(const Employee&) = delete; Employee& operator=(const Employee&) = delete; Employee& operator=(Employee&&) = delete; Employee(Employee&&) = default; explicit Employee(EmployeeType type); } |
lvalueとrvalue
- 名前が無いのがrvalue
- 寿命は式が終わるまで
- 但し、参照型で受ける場合は参照型の寿命になるという特例がある。
- 但し、全てのrvalueがそうというわけではない。TODO: 具体的には?関数の引数のみで使う分は取り敢えず安全らしいがそれもなぜ?
- 名前があるのがlvalue
- 寿命はスコープを抜けるまで
参考:
https://cpplover.blogspot.com/2009/11/rvalue-reference_23.html
&&とは?
rvalue参照型の事。std::move()でlvalue(xvalue?)にキャストできる
keyword
- ムーブコンストラクタ
- ムーブ代入演算子
参考: Qiita
全然関係ないメモ
- 強い型付けをすると異なるものを配列にする時に困る。
- 緩くデータ型だけ定義してそこに関数を分けて作り込んでいく方が良いのでは?
- 継承コンストラクタは子クラスからの引数の転送のみを行う記述を簡潔に記述するために使われる。
参考:https://qiita.com/seriru13/items/b968beff17f2c97885e5
コピーコンストラクタ
オブジェクトの構築時に=でlvalueをコピーする時に呼び出される。
1 2 3 4 5 |
class A { public: A(const A& A){// copy constructor.} } |
A a;
A aa = a; // aaのコピーコンストラクタが呼び出される。
参考:https://en.cppreference.com/w/cpp/language/copy_constructor
ムーブコンストラクタ
オブジェクトの構築時に=でxvalueをコピーする時に呼び出される。
1 2 3 4 5 |
class A { public: A(A&& a){ // move constructor } }; |
A aa;
A a = std::move(aa); // std::move(aa)はxvalueを返す。左辺値のムーブコンストラクタが呼び出される。
参考:https://en.cppreference.com/w/cpp/language/move_constructor
コピー代入演算子
=で右オペランドがlvalueの場合、左オペランドのコピー代入演算子が呼び出される。
int a, b;
a = b; // aのコピー代入演算子が呼び出される。
ムーブ代入演算子
=で右オペランドがprvalue, xvalueの場合に左オペランドのムーブ代入演算子が呼び出される。
A a, aa;
a = A(); // 右辺値はprvalue、aのムーブ代入演算子が呼び出される。
a = std::move(aa); // 右辺値はxvalue、aのムーブ代入演算子が呼び出される。
コメントを残す