Насколько я понимаю, следующий код совместим с 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
не требует инициализатора. Но это снижает гибкость того, что я делаю.