constexpr静态数据成员不存在初始化程序

时间:2019-01-16 17:44:57

标签: static c++17 constexpr literals initializer

据我所读,以下代码是C ++ 17兼容的,确实clang> 5.0接受它,但gcc 8.2不接受。

#include <type_traits> // for is_literal_type_v

struct Wrapper
{
    constexpr Wrapper() :
        initialised_(false),
        value_(0)
    {
    }
    constexpr Wrapper(int value) :
        initialised_(true),
        value_(value)
    {
    }
    const bool initialised_;
    const int value_;
};

static_assert(std::is_literal_type_v<Wrapper>, "must be a literal type");


struct Container
{
    static constexpr Wrapper w; // error: 'constexpr' static data member 'w' must have an initializer
};


int main()
{
}

这在this question中进行了讨论,但最重要的是,我想问一下是否有任何方法(除了提供一个初始化程序之外)来使其起作用 。我想要实现的是在这种情况下(当然)调用Wrapper的无参数c-tor。

此外,如果有GCC错误,最好识别一下。


编辑:请注意,我当前的解决方法是使用名称空间而不是struct。在命名空间范围内,constexpr不需要初始化程序。但这会降低我正在做的事情的灵活性。

1 个答案:

答案 0 :(得分:0)

使用列表初始化语法(大括号)

struct Container
{
    static constexpr Wrapper w{};
};