【发布时间】:2019-02-13 00:50:21
【问题描述】:
这段代码编译:
struct Info
{
constexpr Info(bool val) : counted(false), value(unsigned(val)) {}
constexpr Info(unsigned val) : counted(true), value(val) {}
bool counted;
unsigned value;
};
constexpr const auto data = std::array{
Info{true}, Info{42u}
};
struct Foo
{
constexpr static inline const auto data = std::array{
Info{true}, Info{42u}
};
};
这段代码没有:
struct Foo
{
struct Info
{
constexpr Info(bool val) : counted(false), value(unsigned(val)) {}
constexpr Info(unsigned val) : counted(true), value(val) {}
bool counted;
unsigned value;
};
constexpr static inline const auto data = std::array{
Info{true}, Info{42u}
};
};
报告的错误(在 MSVC、gcc 和 clang 中)表明他们认为 Info 构造函数未定义或不是 constexpr,例如。来自铿锵声:
prog.cc:21:5: note: undefined constructor 'Info' cannot be used in a constant expression
Info{true}, Info{42u}
^
为什么?
(可能与this question 相关,但Info 在使用时应该是完整的;只有Foo 仍然不完整。)
【问题讨论】:
-
@KunalPuri 我已经链接到第一个答案,并解释了为什么在这种情况下它是不够的。第二个问题的评论部分解决了这个问题,但它不是“答案”,而且存在该限制实际上没有意义。