teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

typo修正

2017/12/27 11:02

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -1,10 +1,10 @@
1
1
  こんにちは。
2
2
 
3
3
  ご存知の通り、getHoge()はreturn文でコピーが発生しますね。
4
- そのコピーにて生成された`std::shared_ptr<Hoge>`のインスタンスを 参照の方の x が拘束した結果、保持されます。x がスコープから外れる時に一緒に拘束していた`std::shared_ptr<Hoge>`のインスタンスが開放されます。
4
+ そのコピーにて生成された`std::shared_ptr<Hoge>`のインスタンスを 参照の方の x が拘束した結果、保持されます。x がスコープから外れる時に拘束していた`std::shared_ptr<Hoge>`のインスタンスが一緒に開放されます。
5
5
 
6
6
  参照でない方の x で保持した場合も振る舞いはほぼ同じですが、文法的には異なります。
7
- 最適化が働かない、getHoge()のreturn文でコピーされ一時オブジェクトが生成されます。次に x がコピーコンストラクタにて生成され、その後、その一時オブジェクトが破棄されます。
7
+ 最適化が働かない場合、getHoge()のreturn文でコピーされ一時オブジェクトが生成されます。次に x がコピーコンストラクタにて生成され、その後、その一時オブジェクトが破棄されます。
8
8
  実際には [RVO](http://kmc.hatenablog.jp/entry/2014/12/20/231430) が働くので多くの処理系でコピーは1回で済む筈です。その結果、ほぼ同等の振る舞いのように見える筈です。
9
9
 
10
10
  もし、std::shared_ptrとほぼ同じでコピー・コンストラクタのないクラスでやってみると、参照の x へ代入できても、非参照の x へは代入できない(コンパイルエラーになる)筈です。

1

追記

2017/12/27 11:01

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -7,4 +7,9 @@
7
7
  最適化が働かない、getHoge()のreturn文でコピーされ一時オブジェクトが生成されます。次に x がコピーコンストラクタにて生成され、その後、その一時オブジェクトが破棄されます。
8
8
  実際には [RVO](http://kmc.hatenablog.jp/entry/2014/12/20/231430) が働くので多くの処理系でコピーは1回で済む筈です。その結果、ほぼ同等の振る舞いのように見える筈です。
9
9
 
10
- もし、std::shared_ptrとほぼ同じでコピー・コンストラクタのないクラスでやってみると、参照の x へ代入できても、非参照の x へは代入できない(コンパイルエラーになる)筈です。
10
+ もし、std::shared_ptrとほぼ同じでコピー・コンストラクタのないクラスでやってみると、参照の x へ代入できても、非参照の x へは代入できない(コンパイルエラーになる)筈です。
11
+
12
+ ---
13
+ 【追記】
14
+ あっとと、ごめんなさい。コピー・コンストラクタはgetHoge()のreturn文でも使われるので、これをdeleteするとgetHoge()のreturn文でもエラーになります。なので参照の x への代入もできません。
15
+ う~ん、差を目に見えるようにするのがなかなか難しい。