[问题] unique_ptr + pimpl 建构子解构子

楼主: lovejomi (JOMI)   2018-09-26 12:09:53
看了一些文章“大概“知道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里面 或是直
接删除不写.
谢谢
作者: eye5002003 (下一夜)   2018-09-26 13:36:00
把解构子写出来不就没事了,还有去搞懂何谓前置宣告
楼主: lovejomi (JOMI)   2018-09-26 15:02:00
?有写啊
作者: adrianshum (Alien)   2018-09-26 23:45:00
可以分享一下你提到 Pimpl + unique_ptr 的文章吗?我有点搞不懂,根据 Rule of Zero不是连 dtor 都不该出现吗?oops 当我没说,default 也是符合rule of zero
楼主: lovejomi (JOMI)   2018-09-27 09:11:00
作者: eye5002003 (下一夜)   2018-09-27 13:26:00
因此错在于你隐藏的不够确实,解构子也要放在cpp那边
楼主: lovejomi (JOMI)   2018-09-27 17:11:00
现在是建构子为什么也必须在那,还有其他问题@adrianshum 请问default 也满足rule of zero 是哪里的规定呢 谢谢
作者: Sirctal (母猪母猪 夜里哭哭)   2018-09-27 20:00:00
你可以去看effective modern C++里面有大略讲

Links booklink

Contact Us: admin [ a t ] ucptt.com