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

回答編集履歴

1

間違いを修正

2019/06/11 02:00

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -16,4 +16,10 @@
16
16
  かなりややこしい話があるのですが、上記のようにすることで、obj 領域がそのまま返却されますので、デストラクタは1回しか呼ばれないケースが多いです。
17
17
 
18
18
  微妙な差で2回呼ばれることもありますので、微妙な表現をしてしまいました。
19
- [NRVO/RVO](https://blog.kmc.gr.jp/entry/2014/12/20/231430)が機能するケースではC++17より前は処理系によって1回だけ呼ばれ、[C++17以降では1回が保証される](https://faithandbrave.hateblo.jp/entry/2017/01/24/161342)。NRVO/RVOが機能できないケースでは複数回呼ばれます。
19
+ 所謂[RVO](https://blog.kmc.gr.jp/entry/2014/12/20/231430)が機能するケースではC++17より前は処理系によって1回だけ呼ばれ、[C++17以降では1回が保証される](https://faithandbrave.hateblo.jp/entry/2017/01/24/161342)。NRVO/RVOが機能できないケースでは複数回呼ばれます。
20
+ YUKI007BKBさんのコードは、NRVOが機能して1回だけのデストラクタ呼び出しになっていますので、C++17でも1回だけ呼び出しが「保証」されるというわけではないようです。
21
+
22
+ ---
23
+ 【alphyaさんの回答を見て修正しました】
24
+ てっきりNRVOについてもコピー省略が保証されると理解していましが、どうも異なるようです。
25
+ alphyaさんのリンク先を見るとRVOについてのみ記載されてました。