3

在 C++11 中,我定义了以下一般形式的结构:

struct MyStruct
{
    static void myFunc( void );

    //constructors
    MyStruct( void ) = delete;
};

MyStruct由于默认构造函数被标记为已删除,因此无法创建任何类型的对象。甚至方法myFunc也不能创建类的实例。尽管如此,该结构仍然可以使用,MyStruct::myFunc并且public可以从外部调用。

我现在的问题是:由于不可能创建任何类型MyStruct的对象,编译器是否会费心为复制构造函数、地址运算符或析构函数创建代码?

顺便说一句:就我的实际代码而言,我确实必须根据静态类成员函数来实现功能,因为我必须利用部分模板类特化来模拟部分模板函数特化。所以我想知道如何才能让班级尽可能精简。

编辑:根据@Praetorian 的评论和回答,删除了关于自动生成地址运算符的注释。

4

1 回答 1

5

编译器将为您的类隐式声明析构函数和复制构造函数,但由于您无法创建该类的实例,因此您的程序将永远无法使用析构函数或复制构造函数,因为两者都没有将被隐式定义

§12.4 [class.dtor]

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

5   默认且未定义为已删除的析构函数在被 odr 使用 (3.2) 销毁其类类型 (3.7) 的对象时或在其第一次声明后显式默认时被隐式定义。

§12.8 [class.copy]

7   如果类定义没有显式声明复制构造函数,则隐式声明一个。如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数定义为已删除;否则,它被定义为默认值(8.4)。如果类具有用户声明的复制赋值运算符或用户声明的析构函数,则不推荐使用后一种情况。

13   一个默认且未定义为已删除的复制/移动构造函数,如果它被 odr-used (3.2) 或在其第一次声明后显式默认,则被隐式定义。

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

于 2014-08-07T22:25:46.010 回答