不能在类范围内使用`static_assert`和`sizeof`(但方法范围可以)

ima*_*ett 3 c++ g++

以下是一个简单示例的摘录(请参阅此处完整源代码):

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.

我理解这个类的定义还没有完全被词法写出来,但是肯定所有关于完整类型的信息都存在,对吧?我的意思是,我们在里面.即使不是,为什么它会在方法中起作用?

Ben*_*igt 5

类类型在其自己的成员函数体内完成(正如Matt所说,函数体的处理是延迟的).它{}在类定义中的大多数其他地方都不完整,包括那个static_assert.9.2节的规则是

}类说明符结束时,类被视为完全定义的对象类型(或完整类型) .在类成员规范中,该类在函数体,缺省参数,引入继承构造函数(12.9)的使用声明,异常规范和 非静态数据成员的括号或等于初始化器中被视为完整(包括嵌套类中的这类东西).否则,它在其自己的类成员规范中被视为不完整.

想一想,编译器应该怎么知道你没有

int another_var;
Run Code Online (Sandbox Code Playgroud)

紧接着static_assert呢?

最好的位置static_assert可能就在类定义之后,在命名空间范围内.