我下面的断言是对的吗
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
没有用户定义的构造函数,其隐式默认构造函数也是constexprconstexpr 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
中使用的变量/函数/构造函数术语的详细概述,请参阅此处。
相关文章:
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- C++ 使用增强正则表达式库时断言崩溃
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 如何将向量断言到特征矩阵
- OpenCV - Python 断言错误:SAD 算法 - 立体相机视差图计算
- 使用 Google Test 对自定义断言函数进行单元测试
- 断言"id < 0"在Qt ActiveX中失败
- 初始值设定项列表构造和静态断言
- 在 CppUnit 中测试中止断言失败
- 使用扫描的调试断言失败
- MS 本机单元测试 - 断言::线程失败不起作用
- 如何断言 CRTP 的函数为最终函数?
- 迭代器跳闸视觉C++ 2017 断言
- 如何在 google test in windows 中管理断言
- 为什么我的Qt程序在断言失败后继续运行?
- 在C++中禁用断言宏
- 宏"断言"会在 C++20 中删除吗?
- 在 constexpr 函数中断言
- 如何在 c++11 中静态断言 std::array 类成员进行排序?