内部类的静态constexpr成员

时间:2017-08-23 13:57:24

标签: c++ c++11 constexpr

我正在尝试声明一个静态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

0 个答案:

没有答案