一切是因为看到这篇文章
https://quuxplusone.github.io/blog/2018/07/07/defaulted-destructor-inhibits-mo
ve/
觉得有趣 然后测试了一下
https://ideone.com/B2ZuZf
的确真的是这样....
但这问题令我很困惑
我知道这些special function有implicit compiler帮产生 或是 会被implicit delete..
.
0.对我来讲 "有" or "被delete" 二选一 但这是例外? 还是情况(规则)比我想像的更是
复杂许多
1. 为什么这情况 move会整个"失效", 但 is_move_constructible显示 true?
接着测试RVO相关
https://ideone.com/xTWkSJ
诡异了....这三组乍看可以说是一样的 但....结果只有Foo 可以RVO
于是试着归纳目前的结果
2. 只要class 有写 move or copy 只要择一不是default (就是{空}) , RVO就会发生
如 https://ideone.com/iByEyO
如果RVO能不能做到取决于是不是写default 根本没道理啊?
这样pod struct 看来是无法 rvo?
以上实在是让我一头雾水
我用VC 测试结果竟也一样(难道是standard 规范?)
最后得到一个结论
因为=default 跟 {} 经验显示 不是完全相等(cstr / dstr)
而且似乎依照以上实验可以说{} 比写=default更稳
3. 是不是我可以说 要写一个完美的class 请遵守 rule of five
+ special function若是default行为请把 定义跟宣告分开(说真的没看过这样写) 或
是能用{}就用{}
如 https://ideone.com/14mLze (这样就会RVO)
提到rule of five
4. 想顺便问一下 如果定义一个 interface class
"通常" 大家会怎么写?
如果遵守rule of five
会变成这样 https://ideone.com/cm6rkb
但总觉得通常看到的写法会是直接
class Interface
{
public:
virtual ~Interface() = default;
}
请问我要怎么取舍呢?
谢谢