回答編集履歴
1
update
answer
CHANGED
@@ -10,7 +10,10 @@
|
|
10
10
|
|
11
11
|
`str`クラス(構造体)`get_vec`メンバ関数が、データメンバ`_vec`への参照ではなく**コピー結果を一時オブジェクトとして返す**インタフェースのため、[参考にされたQiita解説記事](https://qiita.com/rinse_/items/ad0cc7e351e836595c94)とは異なる結果になっています。
|
12
12
|
|
13
|
+
----
|
13
14
|
もし、`get_vec`メンバ関数がデータメンバへの参照を返すインタフェース(例えば戻り値型が`auto&`)だとすると:
|
14
15
|
|
15
16
|
- 前者`str().get_vec()`は「危険」です。一時オブジェクト`str()`とともに参照先`vector<string>`実体も破棄されてしまうため、走査中のイテレータは無効オブジェクトを指してしまいます。
|
16
|
-
- 後者`str_exist.get_vec()`は「安全」です。変数`str_exist`の生存期間中は参照先も生存していますから、安全に`vector<string>`実体へとアクセスできます。
|
17
|
+
- 後者`str_exist.get_vec()`は「安全」です。変数`str_exist`の生存期間中は参照先も生存していますから、安全に`vector<string>`実体へとアクセスできます。
|
18
|
+
|
19
|
+
余談:個人の感性にも左右されますが、`get_vec`というメンバ関数名からはデータメンバへの参照を返すインタフェースを想起させますし、効率的なC++クラス設計としても参照を返す方がパフォーマンス上好ましいです。本当に「コピーされたデータを返す」のであれば、`clone`や`copy`などの名称を含めたほうがよいかもしれません。
|