回答編集履歴

2

typo修正

2017/12/27 11:02

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -4,13 +4,13 @@
4
4
 
5
5
  ご存知の通り、getHoge()はreturn文でコピーが発生しますね。
6
6
 
7
- そのコピーにて生成された`std::shared_ptr<Hoge>`のインスタンスを 参照の方の x が拘束した結果、保持されます。x がスコープから外れる時に一緒に拘束していた`std::shared_ptr<Hoge>`のインスタンスが開放されます。
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

追記

2017/12/27 11:01

投稿

Chironian
Chironian

スコア23272

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
+ う~ん、差を目に見えるようにするのがなかなか難しい。