11

考虑结构:

struct mystruct { };

这是否总是有效的:

constexpr mystruct mystructInstance = mystruct();

即 POD 的值初始化是constexpr?同样,如果结构被定义为:

struct mystruct { ~mystruct(); };

最后,这个呢:

struct mystruct { mystruct(); ~mystruct(); };

我没有将 ctr 声明为 constexpr,但是是否有任何隐含的扣除规则可以保证这一点?

4

1 回答 1

8

对变量要求constexpr是:

constexpr 变量必须满足以下要求:

  • 它的类型必须是 LiteralType。
  • 它必须立即构造或赋值。
  • 构造函数参数或要分配的值必须仅包含文字值、constexpr 变量和函数。
  • 用于构造对象的构造函数(隐式或显式)必须满足 constexpr 构造函数的要求。在显式构造函数的情况下,它必须指定 constexpr。

鉴于您的 3 个结构:

struct mystruct_1 { };
struct mystruct_2 { ~mystruct_2(); };
struct mystruct_3 { mystruct_3(); ~mystruct_3(); };

mystruct_1是一个LiteralType。所以以下是有效的并编译:

constexpr mystruct_1 mystructInstance_1 = mystruct_1();

mystruct_2不是a因为LiteralType它有一个重要的析构函数。因此以下内容无效且无法编译:

constexpr mystruct_2 mystructInstance_2 = mystruct_2();

这同样适用于mystruct_3,此外它不是聚合并且不提供constexpr构造函数。所以以下也是无效的,无法编译:

constexpr mystruct_3 mystructInstance_3 = mystruct_3();

您还可以查看此在线演示中的描述性错误消息。

于 2015-08-11T09:41:26.727 回答