[英]Cannot use `static_assert` with `sizeof` inside class scope (but method scope is okay)
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 ++(NB MSVC不抱怨),这产生如下:
错误:'sizeof'无效应用于不完整类型'Foo'
该错误仅发生在第二个static_assert
。
我理解这个类的定义还没有完全被词法写出来,但是肯定所有关于完整类型的信息都存在,对吧? 我的意思是,我们在里面 。 即使不是,为什么它会在方法中起作用?
类类型在其自己的成员函数体内完成(正如Matt所说,函数体的处理是延迟的)。 它在类定义的{}
内的大多数其他地方都不完整,包括static_assert
。 9.2节的规则是
一类被认为是在闭合完全定义的对象类型(或完整的类型)
}
的类指定符 。 在类成员规范中 ,该类在函数体,缺省参数,引入继承构造函数(12.9)的使用声明 , 异常规范和非静态数据成员的括号或等于初始化器中被视为完整(包括嵌套类中的这类东西)。 否则,它在其自己的类成员规范中被视为不完整。
想一想,编译器应该怎么知道你没有
int another_var;
在static_assert
之后出现?
static_assert
的最佳位置可能就在类定义之后,在命名空间范围内。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.