Can*_*0rd 6 c++ constructor deleted-functions
说我有这个结构:
struct F
{
int& ref; // reference member
const int c; // const member
// F::F() is implicitly defined as deleted
};
Run Code Online (Sandbox Code Playgroud)
那是来自cppreference.据我从文档中理解,构造函数F被认为是删除的,因为它有一个引用变量,它什么都没引用.因此,不能F像这样声明类型的变量:F variableName;因为会出现错误,例如:struct中的未初始化的引用成员F.
我理解这一点但是我不明白如果你甚至不能声明它的类型的变量这样的结构会有什么好处.这种数据类型在某些特定情况下是否有用?
由于F是聚合,您可以使用聚合初始化:
int a = 42;
F f1 = {a, 13};
// or
F f2{a, 9};
Run Code Online (Sandbox Code Playgroud)
现场演示.
类类型(通常是struct或union)是聚合,如果它具有:
- 没有私有或受保护的非静态数据成员
- 没有用户提供,继承或显式(自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]) {}
};
Run Code Online (Sandbox Code Playgroud)
参考成员还意味着您需要提供其他成员函数的定义以确保您的对象正确运行,因为它们会使问题复杂化.这就是他们通常被避免的原因.
其他用途无法详尽列举.