gpt4 book ai didi

c++ - 为什么在定义析构函数时编译器不再添加默认移动构造函数和赋值?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:46 26 4
gpt4 key购买 nike

我无法理解自动添加默认 ctors 背后的基本原理。特别是我觉得很尴尬,每次我只需要添加一个空的虚拟析构函数,仅此而已,我松散了移动的东西,但是添加它们我松散了拷贝和默认的东西,所以我最终添加了所有这些代码块:

virtual ~SomeClass(){}           // you are the guilty!
//virtual ~SomeClass() = default // would be the same

SomeClass(SomeClass&&) = default; // no more auto-added
SomeClass& operator=(SomeClass&&) = default; // no more auto-added
SomeClass(const SomeClass&) = default; // but with the moves defined,
SomeClass& operator=(const SomeClass&) = default; // I'm now missing the copy
SomeClass(){} // and the default as well

我确信让我的类变得丑陋并让我渴望一个邪恶的宏是有原因的,我只是想知道它让我感觉更舒服。

最佳答案

看看this .它解释了所谓的五规则,这基本上是标准所要求的。

通常,对于大多数情况,编译器会为复制构造函数、复制赋值、移动赋值和析构函数创建默认值。但是,如果程序员定义了其中任何一个,那么编译器就会假定用户已经在此类中封装了一些需要他/她的特殊功能的东西,比方说。析构函数。既然程序员知道他/她将需要一个析构函数,编译器就会知道程序员知道发生了什么,并且不会为其余部分创建默认值(因为,基于编译器所做的假设,默认值有些会出错,甚至会导致不良行为)。

关于c++ - 为什么在定义析构函数时编译器不再添加默认移动构造函数和赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24937240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com