struct Foo
{
struct Bar
{
int data = 0;
//constexpr Bar() = default; // Doesn't work either
constexpr Bar() : data(0) {}
};
static constexpr Bar bar = {}; // ERROR
//static constexpr Bar bar = {0}; // Works if the ctor from Bar is removed
};
Clang 和 GCC(使用 std=c++20)说我尝试使用的构造函数未定义。但如果我改为 ,它就会constexpr
起作用inline
。我想了解使用“contexpr”有什么问题。
编译器分两遍解析一个类。第一个传递处理成员变量和函数声明,第二个传递处理函数体,这允许您在该函数中使用在函数下面声明的成员变量(或函数)。
当类嵌套时,第一遍遍历整个最外层类(包括所有嵌套类),然后类似地第二遍遍历整个最外层类(包括嵌套类)。
显然,静态变量初始化发生在第一次传递期间。如果它不是
constexpr
(inline
),那么看到构造函数声明就足够了。但如果是constexpr
,则也需要查看构造函数定义(以立即计算值),但在第一次传递期间它不可用。当你摆脱构造函数并执行时
= {0}
,这就是聚合初始化,它根本不使用构造函数,因此可以在第一遍期间工作。