c – 编译器何时为类的特殊成员提供定义?

c – 编译器何时为类的特殊成员提供定义?,第1张

概述我知道当我定义一个空类并且根本不提供声明时,编译器将提供默认和复制构造函数,析构函数和复制赋值运算符的定义. 有什么规则?什么时候编译器不提供复制构造函数?移动构造函数和移动赋值运算符怎么样? (例如:如果我的类有一个类似int&的引用成员,编译器将不会为任何赋值运算符提供定义.否则会发生类似这样的事情?) 编辑:在C 11中,它比隐式声明更复杂.它们可以是隐式声明和默认,隐式声明和删除,也可以是 我知道当我定义一个空类并且根本不提供声明时,编译器将提供默认和复制构造函数,析构函数和复制赋值运算符的定义.

有什么规则?什么时候编译器不提供复制构造函数?移动构造函数和移动赋值运算符怎么样?

(例如:如果我的类有一个类似int&的引用成员,编译器将不会为任何赋值运算符提供定义.否则会发生类似这样的事情?)

解决方法 编辑:在C 11中,它比隐式声明更复杂.它们可以是隐式声明和默认,隐式声明和删除,也可以是未声明的.阅读 this以区分后者2.以下信息并不完全正确,因为它不区分已声明和已删除与未声明.

以下是正在进行的工作. (?)表示我想澄清或量化该陈述.

特别会员职能§12/ 1

当用户没有显式声明它们时,实现将隐式声明某些类类型的这些成员函数:

>默认构造函数
>复制构造函数
>复制赋值运算符
>移动构造函数
>移动赋值运算符
>析构函数

如果类型具有…,则不会隐式声明特殊成员函数.

默认构造函数§12.1/ 5

复制构造函数§12.8/ 8,§12.8/ 12

>用户声明的移动构造函数
>用户声明的移动赋值运算符
> rvalue引用类型的非静态数据成员
>变量成员具有非平凡的复制构造函数,并且是类似联合的类(?)
>无法复制的类型(或其数组)的非静态数据成员
>直接或虚拟基类,没有可访问的复制构造函数

*如果类具有用户声明的复制赋值运算符或用户声明的析构函数(?),则不推荐使用这种隐式声明

复制分配运算符§12.8/ 19,§12.8/ 24

>用户声明的移动构造函数
>用户声明的移动赋值运算符
>具有非平凡复制赋值运算符的变体成员,并且是类似联合的类(?)
> const非类型(或其数组)的非静态数据成员
>引用类型的非静态数据成员
>具有无法访问的复制赋值运算符的非静态数据成员
>具有不可访问的复制赋值运算符的直接或虚拟基类

*如果类具有用户声明的复制构造函数或用户声明的析构函数(?),则不推荐使用此类隐式声明

移动构造函数§12.8/ 10,§12.8/ 12

>用户声明的复制构造函数
>用户声明的复制赋值运算符
>用户声明的移动赋值运算符
>用户声明的析构函数
>移动构造函数不会被隐式定义为已删除(?)
>变量成员有一个非平凡的移动构造函数,是一个类似联合的类(?)
>无法移动的类型(或其数组)的非静态数据成员
>非静态数据成员或直接或虚拟基类,其类型不具有移动构造函数,并且不可轻易复制
>没有可访问移动构造函数的直接或虚拟基类

移动分配运算符§12.8/ 21,§12.8/ 24

>用户声明的复制构造函数
>用户声明的移动构造函数
>用户声明的复制赋值运算符
>用户声明的析构函数
>移动赋值运算符不会被隐式定义为已删除(?)
>具有非平凡移动赋值运算符的变体成员,并且是类似联合的类(?)
> const非类型(或其数组)的非静态数据成员
>引用类型的非静态数据成员
>具有无法访问的移动赋值运算符的非静态数据成员,并且不可轻易复制
>具有不可访问的移动赋值运算符的直接或虚拟基类,并且不是简单的可复制的

析构函数§12.4/ 4

总结

以上是内存溢出为你收集整理的c – 编译器何时为类的特殊成员提供定义?全部内容,希望文章能够帮你解决c – 编译器何时为类的特殊成员提供定义?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1229799.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存