我下面的断言是对的吗

Am I right with my assertions below?

本文关键字:断言      更新时间:2023-10-16

在他的新书"TCPL"的10.4.3节中,B.Stroustrup写道:

一个足够简单的用户定义类型可以在常量中使用表示例如:

struct Point {
int x,y,z;
constexpr Point up(int d) { return {x,y,z+d}; }
constexpr Point move(int dx, int dy) { return {x+dx,y+dy}; }
// ...
};

具有constexpr构造函数的类称为文字类型。未来简单到可以成为constexpr,构造函数必须有一个空主体并且所有成员都必须由潜在的常量初始化表达式。例如:

constexpr点origo{0,0};

这似乎让我感到困惑,原因如下:

  • struct Point没有用户定义的构造函数,其隐式默认构造函数也是constexpr
  • constexpr Point origo {0,0};的编译是因为标准(N3337)中关于在对象声明中使用constexpr的第7.1.5/9段和关于聚合初始化的第8.5.1/7段。它与constexpr构造函数无关

不需要用户定义的构造函数。文本中说"用户定义类型",这是真的,"构造函数必须有一个空主体",这也是真的(默认构造函数相当于一个有空主体的构造函数)。

此外,constexpr用于指示结果是编译时间常数。它不允许/禁止函数上的任何特定语法,只允许编译器在编译时验证是否按预期返回了常数值。函数和声明上的constexpr仅指示函数正在返回编译时常数。

编辑:哦,还有,我想你可能把那句话中的一些独立陈述联系起来了。第一句话和代码片段说明了如何使用用户定义的类型Point作为constexpr函数的返回值。第二位说明Point可用作constexpr变量,因为其构造函数为空;{0,0}语法本身与constexpr构造函数没有特别的关系,但它满足了constexpr变量的要求,其中"构造函数必须有一个空体,并且所有成员都必须由潜在的常量表达式初始化"。有关constexpr中使用的变量/函数/构造函数术语的详细概述,请参阅此处。