Отсутствует инициализатор для члена статических данных constexpr - PullRequest
0 голосов
/ 16 января 2019

Насколько я понимаю, следующий код совместим с 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()
{
}

Это обсуждается в этом вопросе , но вдобавок к этому Я хотел бы спросить, есть ли какой-нибудь способ (кроме, ну, в общем, обеспечения инициализатора), чтобы заставить его работать . В этом случае я бы хотел, чтобы в этом случае (конечно) был вызван c-tor без аргументов Wrapper.

Кроме того, было бы хорошо определить ошибку GCC, если она есть.


Редактировать : Обратите внимание, что мой текущий обходной путь - использовать пространство имен вместо struct. Кажется, в области имен constexpr не требует инициализатора. Но это снижает гибкость того, что я делаю.

1 Ответ

0 голосов
/ 18 января 2019

Использовать синтаксис инициализации списка (фигурные скобки):

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