在c++ 11中,当类没有任何构造函数时,自动生成类成员函数

Automatically generated class member functions in C++11 in the case of classes which do not have any constructors

本文关键字:构造函数 自动生成 函数 成员 任何 c++      更新时间:2023-10-16

在c++ 11中,我定义了一个一般形式的结构体:

struct MyStruct
{
    static void myFunc( void );
    //constructors
    MyStruct( void ) = delete;
};

不能创建任何类型为MyStruct的对象,因为默认构造函数被标记为已删除。甚至方法myFunc也不能创建类的实例。这个结构体仍然可以使用,因为MyStruct::myFuncpublic,并且可以从外部调用。

我现在的问题是:既然不可能创建类型MyStruct的任何对象,编译器甚至会费心为复制构造函数,地址操作符或析构函数创建代码吗?

作为注释:在我的实际代码中,我确实必须根据静态类成员函数实现功能,因为我必须使用部分模板类专门化来模拟部分模板函数专门化。所以我想知道我怎样才能使班级尽可能的精简。

Edit:根据@禁卫军的评论和回答,删除关于自动生成地址操作符的注释

编译器将隐式地为你的类声明析构函数和复制构造函数,但是由于你没有办法创建类的实例,你的程序将永远不能多使用析构函数或复制构造函数,因为它们都不会隐式地定义。

§12.4 [class.dtor]

4

,如果类没有用户声明的析构函数,则隐式地将析构函数声明为默认值(8.4)。隐式声明的析构函数是其类的inline public成员。

5 ,默认的且未定义为deleted的析构函数,当它被odr(3.2)用于销毁其类类型的对象(3.7)时,或者当它在第一次声明后显式默认时,则隐式定义。

§12.8 [class.copy]

7

,如果类定义没有显式声明复制构造函数,则隐式声明复制构造函数。如果类定义声明了move构造函数或move赋值操作符,则隐式声明的复制构造函数定义为deleted;否则,它被定义为默认值(8.4)。如果类具有用户声明的复制赋值操作符或用户声明的析构函数,则不建议使用后一种情况。

13,如果复制/移动构造函数是默认的且未定义为deleted,则它是隐式定义的,如果它是odr使用的(3.2),或者当它在第一次声明后显式默认时。

对于地址操作符(operator&),编译器永远不会隐式地为您生成操作符重载。操作符的内置地址可以应用于任何左值类型以获取其地址,但这是一个语言特性,与为用户定义的类型重载该操作符无关。