在c ++标准中,指定在类 member-specification (类主体)中,可以将该类视为完全定义,但不能用于静态数据成员初始值设定项[class.mem]:
编辑:这是N4687的引用,措辞已经改变,但我不相信意思改变了。在结束时,类被视为完全定义的对象类型(6.9)(或完整类型) 类说明符。在类 member-specification 中,该类在函数内被视为完整 body,默认参数, noexcept-specifiers 和默认成员初始值设定项(包括 嵌套类)。否则,它在其自己的类 member-specification 中被视为不完整。
我期待编译这样的代码:
struct enum_like
{
static constexpr enum_like enum_member{};
};
为什么C ++标准不允许这样的定义?
我相信编译器可以这样做:
读取成员声明,直到类定义结束括号才定义。 (现在编译器有一个完全定义的类)
分析静态数据成员初始值设定项(这样编译器具有constexpr成员的常量定义)
分析其他成员定义。
然后解析静态成员临时函数的递归,如[decl.init]中为非静态成员指定的那样!
答案 0 :(得分:2)
此规则禁止出现以下问题:
struct A {
static constexpr std::size_t N = sizeof(A);
char buffer[N+2];
};