回答編集履歴
2
typo修正
test
CHANGED
@@ -4,13 +4,13 @@
|
|
4
4
|
|
5
5
|
ご存知の通り、getHoge()はreturn文でコピーが発生しますね。
|
6
6
|
|
7
|
-
そのコピーにて生成された`std::shared_ptr<Hoge>`のインスタンスを 参照の方の x が拘束した結果、保持されます。x がスコープから外れる時に
|
7
|
+
そのコピーにて生成された`std::shared_ptr<Hoge>`のインスタンスを 参照の方の x が拘束した結果、保持されます。x がスコープから外れる時に拘束していた`std::shared_ptr<Hoge>`のインスタンスが一緒に開放されます。
|
8
8
|
|
9
9
|
|
10
10
|
|
11
11
|
参照でない方の x で保持した場合も振る舞いはほぼ同じですが、文法的には異なります。
|
12
12
|
|
13
|
-
最適化が働かない、getHoge()のreturn文でコピーされ一時オブジェクトが生成されます。次に x がコピーコンストラクタにて生成され、その後、その一時オブジェクトが破棄されます。
|
13
|
+
最適化が働かない場合、getHoge()のreturn文でコピーされ一時オブジェクトが生成されます。次に x がコピーコンストラクタにて生成され、その後、その一時オブジェクトが破棄されます。
|
14
14
|
|
15
15
|
実際には [RVO](http://kmc.hatenablog.jp/entry/2014/12/20/231430) が働くので多くの処理系でコピーは1回で済む筈です。その結果、ほぼ同等の振る舞いのように見える筈です。
|
16
16
|
|
1
追記
test
CHANGED
@@ -17,3 +17,13 @@
|
|
17
17
|
|
18
18
|
|
19
19
|
もし、std::shared_ptrとほぼ同じでコピー・コンストラクタのないクラスでやってみると、参照の x へ代入できても、非参照の x へは代入できない(コンパイルエラーになる)筈です。
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
---
|
24
|
+
|
25
|
+
【追記】
|
26
|
+
|
27
|
+
あっとと、ごめんなさい。コピー・コンストラクタはgetHoge()のreturn文でも使われるので、これをdeleteするとgetHoge()のreturn文でもエラーになります。なので参照の x への代入もできません。
|
28
|
+
|
29
|
+
う~ん、差を目に見えるようにするのがなかなか難しい。
|