C++ 我下面的断言正确吗?

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构造函数的类称为文本类型。成为 一个构

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}; }
// ...
};
origo{0,0}的constexpr点

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

  • struct Point
    没有用户定义的构造函数,其隐式默认构造函数也不是constexpr
  • constepr点origo{0,0}constexpr
    )和第8.5.1/7段(关于聚合初始化),代码>进行编译。它与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
      未初始化。现在同意这两点:)