Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(destructors): more description #64

Merged
merged 3 commits into from
Nov 29, 2020
Merged

Conversation

yumetodo
Copy link
Contributor

  • デストラクタをそもそも自分で定義するべきではない、デメリットが有る
  • デストラクタは暗黙のうちにnoexcept指定される
  • RAIIについてはもっと大きく扱っていいのではないか

@yumetodo
Copy link
Contributor Author

例外周りは
https://rinatz.github.io/cpp-book/ch10-01-exceptions/#_7
とかぶってしまいました

@rinatz
Copy link
Owner

rinatz commented Nov 26, 2020

多態性を実現するときは std::shared_ptr を使って基底クラスのポインタを扱えば
仮想でなくてもデストラクタは適切に呼び出されるので、仮想デストラクタを作らせるより
std::shared_ptr の使用を推奨したほうが良くないでしょうか。

@yohhoy
Copy link

yohhoy commented Nov 27, 2020

デストラクタを書かない
不用意にデストラクタを定義( = default 指定も含む)すると、ムーブコンストラクタ/代入演算子が自動定義されなくなり、またコピーコンストラクタ/代入演算子は自動生成されるものの非推奨(=使ってはいけない)になります。

メンバ変数でRAII型を活用して、ユーザ定義のデストラクタを避けるという点は大いに賛同です。
一方、デストラクタの=default指定も忌避対象とするのは少々行き過ぎではとも思いました。

特殊メンバ関数であるデストラクタに=default明示するのであれば、合わせてムーブ/コピー・コンストラクタ/代入演算子の4種類も=default明示するべきです。The Zen of Pythonにもある「Explicit is better than implicit.」ですね。

参考:Rule of three/five/zero

@yumetodo
Copy link
Contributor Author

https://qiita.com/yumetodo/items/b0ff58617f2733d4ffa1
からほとんど持ってきたのですが、なるほど確かに全部=defaultすれば問題ないのか・・・。

@yumetodo
Copy link
Contributor Author

yumetodo commented Nov 27, 2020

仮想デストラクタを作らせるより std::shared_ptr の使用を推奨したほうが良くないでしょうか。

言われてみればそうなんですが、仮想デストラクタを作る慣習自体は消えていない気がしています(普段動的ポリモフィズムしないので若干疎いですが)。あるいはstd::variantを使う動的ポリモフィズムがもっと普及すると変わってくるのでしょうか。なによりも仮想デストラクタの項目は本PRの対象としていないので、 #63 あたりで議論するのがいいのかなという気がします。

@rinatz
Copy link
Owner

rinatz commented Nov 28, 2020

仮想デストラクタを作る慣習自体は消えていない気がしています

まあ今でも書いてる人は多いと思います。
ただこれを容認してしまうとデストラクタは常に書いたほうがいいという風に受け取られる可能性も・・・

そもそも継承自体がアンチパターンを生みやすく
継承を使わなくてもコンポジションで解決できることが多いので
classfinal にしてデストラクタを書かなくて済むようにしてます。
私がデストラクタを書くときは finally 的なことをするクラスを作るときくらいですかね。
あとはだいたいライブラリで事足りる印象です。

@yumetodo
Copy link
Contributor Author

「デストラクタを書かない」の項をレビューを受けて修正してみました。

継承した時のデストラクタについては本PRではいじりません。

@rinatz rinatz merged commit 266028a into rinatz:master Nov 29, 2020
@yumetodo yumetodo deleted the patch-7 branch November 29, 2020 09:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants