据我所读,以下代码是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
不需要初始化程序。但这会降低我正在做的事情的灵活性。
答案 0 :(得分:0)
使用列表初始化语法(大括号)
struct Container
{
static constexpr Wrapper w{};
};