2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

型視点のpointer , reference , assignment 理解

Last updated at Posted at 2018-02-19

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の演算子(=)は、通常の束縛だけでなく、関数への代入、関数から帰る場合にも適用される。 

演算子が何を引数にとり、どの型に束縛可能かは若干ややこしいので図にしてみた。

g1.png

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は完全に理解できてない。。。

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?