说我有这种结构:
struct F
{
int& ref; // reference member
const int c; // const member
// F::F() is implicitly defined as deleted
};
那是来自cppreference。正如我从文档中理解的那样,F
的构造函数被认为是被删除的,因为它有一个引用任何内容的引用变量。因此,我们不能像F
那样声明F variableName;
类型的变量,因为会出现错误,例如:struct F
中未初始化的引用成员。
我理解这一点但是我不明白如果你甚至不能声明它的类型变量这样的结构会有什么好处。这种数据类型在某些特定情况下是否有用?
答案 0 :(得分:9)
由于F
是汇总,您可以使用aggregate initialization:
int a = 42;
F f1 = {a, 13};
// or
F f2{a, 9};
类类型(通常是struct或union)是聚合,如果它具有:
- 没有私人或受保护的非静态数据成员
- 没有用户提供,继承或显式(自C ++ 17)构造函数(允许显式默认或删除构造函数)(自C ++ 11开始)
- 没有虚拟,私有或受保护(自C ++ 17以来)基类
- 没有虚拟成员函数
答案 1 :(得分:6)
我理解这一点但是我不明白如果你甚至不能声明它的类型的变量这样的结构会有什么好处。这种数据类型在某些特定情况下是否有用?
隐藏的默认构造函数被删除并不意味着你永远不能使用这种类型。这意味着您必须自己定义构造函数,因为只有您(程序员)才能知道应该绑定哪个引用。所以编译器会把它留给你,如果你忘了,你会收到通知,你的c'tor会被删除。
这就是为什么它被删除了,但正如人们提到的那样,这本身并不意味着你不能按原样使用那个结构。它仍然可以聚合初始化它(如果它有私有数据成员则不可能,所以也需要考虑)。
一个简单的用例可能是别名成员。例如(这是一个玩具示例,您可以使用默认成员初始化程序):
struct Point {
double coord[3];
double& x;
double& y;
double& z;
Point() : x(coord[0]), y(coord[1]), z(coord[2]) {}
};
参考成员还意味着您需要提供其他成员函数的定义以确保您的对象正确运行,因为它们会使问题复杂化。这就是他们通常被避免的原因。
其他用途无法详尽列举。