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!");
};
Run Code Online (Sandbox Code Playgroud)
在最近的g ++(NB MSVC不抱怨),这产生如下:
错误:'sizeof'无效应用于不完整类型'Foo'
该错误仅在第二个时发生static_assert.
我理解这个类的定义还没有完全被词法写出来,但是肯定所有关于完整类型的信息都存在,对吧?我的意思是,我们在里面.即使不是,为什么它会在方法中起作用?
类类型在其自己的成员函数体内完成(正如Matt所说,函数体的处理是延迟的).它{}在类定义中的大多数其他地方都不完整,包括那个static_assert.9.2节的规则是
}在类说明符结束时,类被视为完全定义的对象类型(或完整类型) .在类成员规范中,该类在函数体,缺省参数,引入继承构造函数(12.9)的使用声明,异常规范和 非静态数据成员的括号或等于初始化器中被视为完整(包括嵌套类中的这类东西).否则,它在其自己的类成员规范中被视为不完整.
想一想,编译器应该怎么知道你没有
int another_var;
Run Code Online (Sandbox Code Playgroud)
紧接着static_assert呢?
最好的位置static_assert可能就在类定义之后,在命名空间范围内.
| 归档时间: |
|
| 查看次数: |
313 次 |
| 最近记录: |