C++ 我下面的断言正确吗?
B.Stroustrup在其新书《TCPL》第10.4.3节中写道: 可以在常量中使用足够简单的用户定义类型 表情。例如:C++ 我下面的断言正确吗?,c++,c++11,initialization,constexpr,C++,C++11,Initialization,Constexpr,B.Stroustrup在其新书《TCPL》第10.4.3节中写道: 可以在常量中使用足够简单的用户定义类型 表情。例如: 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构造函数的类称为文本类型。成为 一个构
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构造函数的类称为文本类型。成为
一个构造函数必须有一个空的主体
所有成员必须由潜在常量初始化
表达。例如:
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}; }
// ...
};
origo{0,0}的constexpr点
这似乎让我感到困惑,原因如下:
没有用户定义的构造函数,其隐式默认构造函数也不是constexprstruct Point
constepr点origo{0,0}根据标准(N3337)第7.1.5/9段(关于在对象声明中使用
)和第8.5.1/7段(关于聚合初始化),代码>进行编译。它与constexpr构造函数无关constexpr
- 不需要用户定义的构造函数。文本显示“用户定义类型”,这是真的,“构造函数必须有一个空的主体”,这是真的(默认构造函数相当于一个有空主体的构造函数)
另外,
constexpr
用于指示结果是编译时常量。它不允许/不允许对函数使用任何特定语法,只允许编译器在编译时验证是否按预期返回了常量值。函数和声明上的constepr
仅指示函数返回编译时常量
编辑:哦,还有,我想你可能在引用中链接了一些独立的语句。第一句话和代码片段说明了如何将用户定义的类型
Point
用作constexpr
函数的返回值。第二位说明点
可以用作constepr
变量,因为其构造函数为空;{0,0}
语法本身与constexpr
构造函数没有特别的关系,但它满足了constexpr
变量的要求,其中“构造函数必须有一个空的主体,所有成员必须由潜在的常量表达式初始化”。有关constexpr
中使用的变量/函数/构造函数术语的详细概述,请参阅。我要说的是,表达式constexpr指向origo{0,0}代码>编译,与constexpr构造函数无关。事实上,@MikeDeSimone我在回答中澄清了一些陈述不当的观点,对此表示抱歉。“其隐式默认构造函数也不是constexpr”为什么不隐式声明(&defined)呢默认的构造函数是constepr
?我同意你的第二点:在聚合初始化点{0,0}
@dyp中没有构造函数调用,为什么隐式声明(定义)的默认构造函数不应该是constepr?
成员x
,y
和z
未初始化。现在同意这两点:)