【问题标题】:Am I right with my assertions below?我在下面的断言是否正确?
【发布时间】:2014-04-07 17:02:46
【问题描述】:

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 构造函数的类称为文字类型。成为 简单到可以是 constexpr,构造函数必须有一个空的主体 并且所有成员必须由潜在常量初始化 表达式。例如:

constexpr 点原点 {0,0};

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

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

【问题讨论】:

  • "也不是它的隐式默认构造函数是 constexpr" 为什么隐式声明(&定义)的默认 ctor 不应该是 constexpr
  • 我同意你的第二点:聚合初始化Point{0,0}中没有构造函数调用。
  • @dyp Why shouldn't the implicitly-declared (&defined) default ctor be constexpr? 成员 xyz 未初始化。
  • 现在同意这两点:)

标签: c++ c++11 initialization constexpr


【解决方案1】:

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

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

编辑:哦,另外,我认为您可能在该引用中链接了一些独立的陈述。第一句和代码 sn-p 说明了如何将用户定义类型 Point 用作 constexpr 函数的返回值。第二位说明Point 可以用作constexpr 变量,因为它的构造函数是空的; {0,0} 语法本身与 constexpr constructors 没有特别的关系,但它满足 constexpr 变量的要求,其中“构造函数必须有一个空的主体并且所有成员必须由潜在的初始化常量表达式”。请参阅 here 以全面了解与 constexpr 一起使用的变量/函数/构造函数术语。

【讨论】:

猜你喜欢
  • 2020-04-12
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多