作者lovejomi (JOMI)
看板C_and_CPP
标题[问题] unique_ptr + pimpl 建构子解构子
时间Wed Sep 26 12:09:53 2018
看了一些文章“大概“知道pimpl+uniqueptr为什麽要把解构子宣告跟定义要分开
因为没分开 compiler会gen code然後用到 deleter 间接需要 看到complete type
於是就做了一些实验,然後就发现有些无法理解的地方
https://wandbox.org/permlink/QRaV5jfUA5wKgE4c
1. 这边故意让建构子定义不分开,就编译不过. 不知道为什麽会去碰到deleter 我建构
子也没刻意去new Foo
https://wandbox.org/permlink/GZwtpA8GUuilcGXP
vs
https://wandbox.org/permlink/DLCA2r2aXsg3MJ3f
都是把main用到Bar b; 遮掉 差异在 Bar.h内
~Bar() = default; vs ~Bar() {}
原本以为这两个是几乎等价的写法 但似乎还是有差距
2. 但我不理解为什麽一个build的过一个不行?
最後又好奇的做一个实验
基於以下会build error
https://ideone.com/vVQAbv
我试着把 class Foo{}; 定义在 Bar::Bar(){} and ~Bar(){} 下面
https://wandbox.org/permlink/vkPvz0rcMblhC8O9
竟然也build过了!?
3. 为什麽这样不会说undecalre error. 其实写code常常会遇到类似这种问题, 明明觉得
应该会build failed(因为宣告顺序问题)
但莫名其妙没error, 一时之间找不到例子, 有些情况发生在template, 但似乎有个"t
wo phase name lookup", 但这边又不是template?
4. 也许都不用管太多, 是不是最正规的写法就是 class内有unique_ptr 好习惯就是 建
构解构定义在class外,
但总觉得写出 Bar::~Bar() = default; 一定会被问说怎麽不放在class里面 或是直
接删除不写.
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 39.9.226.34
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1537935000.A.F87.html
1F:→ eye5002003: 把解构子写出来不就没事了,还有去搞懂何谓前置宣告 09/26 13:36
2F:→ lovejomi: ?有写啊 09/26 15:02
3F:→ adrianshum: 可以分享一下你提到 Pimpl + unique_ptr 的文章吗? 09/26 23:45
4F:→ adrianshum: 我有点搞不懂,根据 Rule of Zero不是连 dtor 都不该 09/26 23:46
5F:→ adrianshum: 出现吗? 09/26 23:47
6F:→ adrianshum: oops 当我没说,default 也是符合rule of zero 09/27 00:00
8F:→ eye5002003: 因此错在於你隐藏的不够确实,解构子也要放在cpp那边 09/27 13:26
9F:→ lovejomi: 现在是建构子为什麽也必须在那,还有其他问题 09/27 17:11
10F:→ lovejomi: @adrianshum 请问default 也满足rule of zero 是哪里的 09/27 17:31
11F:→ lovejomi: 规定呢 谢谢 09/27 17:31
12F:推 Sirctal: 你可以去看effective modern C++里面有大略讲 09/27 20:00