以下是一个简单示例的摘录(请参阅full source live here):
class Foo final {
public:
int var;
inline Foo(void) {
static_assert(sizeof(Foo)==sizeof(int),"Implementation error!");
}
static_assert(sizeof(Foo)==sizeof(int),"Implementation error!");
};
在最近的g ++(N.B。MSVC并没有抱怨)中,这产生了类似的东西:
错误:'sizeof'无法应用于不完整类型'Foo'
第二个static_assert
仅发生 。
据我所知,该课程的定义还没有完成 lexically 的写法,但是完整类型的所有信息肯定都存在,对吧?我的意思是,我们内部这件事。即使不是,为什么它会在方法中起作用?
答案 0 :(得分:5)
类类型在其自己的成员函数体内完成(正如Matt所说,函数体的处理是延迟的)。它在类定义的{}
内的大多数其他位置都不完整,包括static_assert
。第9.2节中的规则是
在类说明符的结束
}
,类被视为完全定义的对象类型(或完整类型)。在类 member-specification 中,该类在函数内被视为完整 主体,默认参数, using-declarations 引入继承构造函数(12.9), exception-specifications ,以及 brace-or-equal-initializers 用于非静态数据成员(包括嵌套类中的这类内容)。否则,它在其自己的类 member-specification 中被视为不完整。
考虑一下,编译器应该如何知道你没有
int another_var;
紧接static_assert
之后?
static_assert
的最佳位置可能就在类定义之后,在命名空间范围内。