c++の
pointer(*), 左辺値参照(&),右辺値参照(&&) assignment(=)の理解において、完全なる理解が未だにできていなかったのでメモ。できるだけ簡潔にまとめる。
まず、型構築子と演算子を分離して理解する。
- 後置きで型に付けられる型構築子
役割 | 表記 | 取れる型 |
---|---|---|
左辺値参照 | (type)& | primitive,object |
右辺値参照 | (type)&& | primitive,object |
pointer | (type)* | primitive,object,pointer |
- 前置き演算子
名前 | 表記 | 役割 |
---|---|---|
copy | = (expr) | 値のcopy(deep,shallow) |
move | = std::move(expr) | 値のmove.実態は参照をremoveして、またつけるという処理) |
reference | & (expr) | ptr型を(1つ)被せる |
dereference | * (expr) | ptr型を(1つ)外す |
がある。
copy,moveの演算子(=)は、通常の束縛だけでなく、関数への代入、関数から帰る場合にも適用される。
演算子が何を引数にとり、どの型に束縛可能かは若干ややこしいので図にしてみた。
pointは、
- lref,fundamentalの中では、= 相互交換可能。
- fundamentalへの = はdeep copy
- lref , ptr への = はshallow copy
- 演算子& は ptrをnestさせていく
ref -> ptr<ref>
,ptr -> ptr<ptr>
- 演算子* は nestしたptrだったら*の数だけnestを外し、ptrが一個しかなかったら (type)&,(type)に copyできる
ptr<ptr<T>> -> ptr<T>
,ptr<ref> -> ref
色々考えたけどまだ、std::moveは完全に理解できてない。。。