C++删除了构造函数



假设我有这个结构:

struct F
{
int& ref; // reference member
const int c; // const member
// F::F() is implicitly defined as deleted
};

这是来自cpp偏好。正如我从文档中了解到的那样,F的构造函数被认为是已删除的,因为它有一个引用变量,该变量不引用任何内容。因此,不能像这样声明类型F变量:F variableName;因为会出现错误,例如:结构F中未初始化的引用成员。

我理解这一点,但是如果您甚至不能声明其类型的变量,我不明白这样的结构有什么好处。这样的数据类型在某些特定情况下有用吗?

由于F是一个聚合,因此您可以使用聚合初始化:

int a = 42;
F f1 = {a, 13};
// or
F f2{a, 9};

现场演示。

类类型(通常为结构或联合(是聚合,如果它具有:

  • 没有私有或受保护的非静态数据成员
  • 没有用户提供的、继承的或显式的(自 C++17 起(构造函数(允许显式默认或删除的构造函数((自 C++11 起(
  • 没有虚拟、私有或受保护(自 C++17 起(基类
  • 无虚拟成员函数

我理解这一点,但是如果您甚至不能声明其类型的变量,我不明白这种结构有什么好处。这样的数据类型在某些特定情况下有用吗?

删除隐式默认构造函数并不意味着永远不能使用此类型。这意味着您必须自己定义构造函数,因为只有您(程序员(才能知道该引用应该绑定到什么。所以编译器把它留给你,如果你忘记了,你会被告知c'tor被删除。

这就是它被删除的原因,但正如人们所提到的,这本身并不意味着你不能按原样使用该结构。仍然可以聚合初始化它(但是,如果它具有私有数据成员,则无法实现,因此也需要考虑这一点(。

一个简单的用例可能是别名成员。例如(这是一个玩具示例,您可以使用默认成员初始值设定项(:

struct Point {
double coord[3];
double& x;
double& y;
double& z;
Point() : x(coord[0]), y(coord[1]), z(coord[2]) {}
};

引用成员还意味着您需要为其他成员函数提供定义以确保对象正常运行,因为它们使事情变得有些复杂。这就是为什么通常避免使用它们的原因。

其他用途实际上无法详尽无遗地列举。

相关内容

最新更新