回答編集履歴
1
typo修正
answer
CHANGED
@@ -14,11 +14,11 @@
|
|
14
14
|
|
15
15
|
前者は、式のように見えませんが実は式を渡しています。後者は変数を渡しています。
|
16
16
|
式と変数の大きな差は、ざっくり書くと(一部の例外を除き)結果が右辺値(値)か左辺値(容器)かの差です。
|
17
|
-
右辺値と左辺値の最大の差は、そこへ値を「代入」できるかどうかです。普通は右辺値に値を代入することはできませんが左辺値は普通に値を代入できます。(`a=a+123;`において a 左辺値、a+123の計算結果は右辺値です。)
|
17
|
+
右辺値と左辺値の最大の差は、そこへ値を「代入」できるかどうかです。普通は右辺値に値を代入することはできませんが、左辺値は普通に値を代入できます。(`a=a+123;`において a は左辺値、a+123の計算結果は右辺値です。)
|
18
18
|
|
19
|
-
関数の仮引数はコピー渡しなら右辺値、左辺値共に受け取れます。ご提示されているfoo()関数はご存知のようにコピー渡しですから、上記の前者・後者どちらとも受け取れます。ただし、コピー渡しですから当然コピーが発生します。int型等の小さな変数を引き渡す時に好ましい渡し
|
19
|
+
関数の仮引数はコピー渡しなら右辺値、左辺値共に受け取れます。ご提示されているfoo()関数はご存知のようにコピー渡しですから、上記の前者・後者どちらとも受け取れます。ただし、コピー渡しですから当然コピーが発生します。int型等の小さな変数を引き渡す時に好ましい渡し方です。
|
20
20
|
|
21
|
-
さて、大きな変数を渡す時はコピーのコストを嫌う
|
21
|
+
さて、大きな変数を渡す時はコピーのコストを嫌うため参照渡しが好まれます。この時に右辺値、左辺値が問題になります。
|
22
22
|
ノーマルな参照型の仮引数は左辺値しか受け取れません。
|
23
23
|
constな参照型の仮引数は左辺値、右辺値共に受け取れますが、constですので内容を変更できません。
|
24
24
|
右辺値参照型の仮引数は右辺値を受け取れ内容も変更できますが、左辺値を受け取れません。(右辺値は式の計算結果ですのでその内容を変更しても意味はないので内容を変更する目的で使われることはあまりなさそうです。)
|