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

回答編集履歴

1

update

2019/12/17 03:59

投稿

yohhoy
yohhoy

スコア6191

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`などの名称を含めたほうがよいかもしれません。