我正在尝试声明一个静态constexpr成员,其类型是内部类。这个内部类作为constexpr构造函数,所以在我看来,一切都应该没问题。但事实并非如此。事实上,当我将内部类移出包含类时,一切正常。
这是一个最小的例子:
class Foo {
public:
constexpr Foo(int param) : i(param) {};
int i;
};
class Bar {
public:
class InnerFoo {
public:
constexpr InnerFoo(int param) : i(param) {};
int i;
};
static constexpr Foo f { 1 };
static constexpr InnerFoo inner_f { 2 };
};
int main() {
Bar b;
}
clang / gcc的错误消息不是很有帮助。 Clang告诉我:
16 : <source>:16:31: error: constexpr variable 'inner_f' must be initialized by a constant expression
static constexpr InnerFoo inner_f { 2 };
^~~~~~~~~~~~~
16 : <source>:16:31: note: undefined constructor 'InnerFoo' cannot be used in a constant expression
11 : <source>:11:19: note: declared here
constexpr InnerFoo(int param) : i(param) {};
我无法看到构造函数是如何定义的?它与Foo()完全相同,而对于Foo()它似乎被定义了? gcc的错误消息稍微有用:
16 : <source>:16:43: error: 'constexpr Bar::InnerFoo::InnerFoo(int)' called in a constant expression before its definition is complete
static constexpr InnerFoo inner_f { 2 };
但是这个定义怎么还没有“完整”?在完全声明包含类之后,内部类的方法的定义是否只是“完整”?如果是这样,有没有办法重新填充代码,以便我可以拥有一个内部类的静态constexpr成员?
谢谢,
的Lukas