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

时间:2015-02-18 05:14:46

标签: c++ g++

以下是一个简单示例的摘录(请参阅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 的写法,但是完整类型的所有信息肯定都存在,对吧?我的意思是,我们内部这件事。即使不是,为什么它会在方法中起作用?

1 个答案:

答案 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的最佳位置可能就在类定义之后,在命名空间范围内。