关于隐式生成包含/继承类的移动构造函数,C++ 11标准中隐式和显式删除的移动构造函数的不同处理背后的基本原理是什么?
C++ 14/C++ 17有什么改变吗?(C++ 14中的DR1402除外)
注意:我理解发生了什么,我理解它是根据C++ 11标准的规则,我对这些规则的理由感兴趣,这意味着这种行为(请确保不要简单地重申它是这样的方式这是因为标准说的是这样).
假设一个类ExplicitDelete具有明确删除的移动ctor和明确默认的复制ctor.move constructible即使兼容的拷贝ctor可用,这个类也是不可用的,因为重载决策选择了移动构造函数,并且由于删除而在编译时失败.
假设一个ImplicitDelete包含或继承的类,ExplicitDelete不执行任何其他操作.由于C++ 11移动ctor规则,此类将其ctor隐式声明为已删除.但是,这个课程仍将move constructible通过其复制ctor.(这最后的陈述是否与DR1402的解决方案有关?)
然后,Implicit包含/继承的类ImplicitDelete将生成一个完全精细的隐式移动构造函数,该构造函数调用ImplicitDelete复制ctor.
那么允许Implicit能够隐式移动而ImplicitDelete不能隐式移动的理由是什么呢?
在实践中,如果Implicit并且ImplicitDelete有一些重型的可移动成员(想想vector<string>),我认为没有理由Implicit比ImplicitDelete移动性能更优越.ImplicitDelete仍然可以复制ExplicitDelete其隐含的动作ctor-就像Implicit它一样ImplicitDelete.
对我来说,这种行为似乎不一致.如果发生以下两种情况之一,我会发现它更加一致:
编译器同时处理隐式和显式删除的移动ctors:
ImplicitDelete变得不move-constructible,就像ExplicitDeleteImplicitDelete的删除的举动男星导致删除的隐含移动构造函数Implicit(在以同样的方式ExplicitDelete做,为ImplicitDelete …